C# 怎么获取所有打开的窗体(包括隐藏的窗体)

QIAN448043229 2011-01-21 04:24:56
问题如题目
我使用Application.OpenForms能够获取所有打开的窗体但是如果窗体设置了Visible=false的时候就无法获取该隐藏的窗体了有办法把隐藏的窗体也获取出来吗?
...全文
1406 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
QIAN448043229 2011-01-21
  • 打赏
  • 举报
回复
好了直接使用单例反射获取方法直接调用就OK了~~~谢谢各位热心人士
QIAN448043229 2011-01-21
  • 打赏
  • 举报
回复
有办法能根据转换出来的Form提取到这个Form里面的所有方法吗?
QIAN448043229 2011-01-21
  • 打赏
  • 举报
回复
反射出来的type是可以获取到信息但是反射出来type使用
Form _LoadForm = (Form)t.InvokeMember(null, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.CreateInstance, null, null, null);
转换为Form的时候还是相当于New一个
我想要的效果是根据一个名字找到整个Form 并且直接设置visable和ShowInTaskbar就能接着隐藏前的操作继续操作下去。
KissXYL 2011-01-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qian448043229 的回复:]

openforms如果ShowInTaskbar也设置为false就没有了吧
[/Quote]

也没错。你错误的贴个地址,下载看看?还真没实现你的错误效果。
QIAN448043229 2011-01-21
  • 打赏
  • 举报
回复
openforms如果ShowInTaskbar也设置为false就没有了吧
KissXYL 2011-01-21
  • 打赏
  • 举报
回复
测试了一下。visable=false的也会被统计在openforms中的。
QIAN448043229 2011-01-21
  • 打赏
  • 举报
回复
我上百个窗体而且我只有窗体的名字使用
//将字符串类型的窗体名转换为窗体并SHOW出窗体
Type type = Type.GetType(dingtie.FormName);
form = (Form)Activator.CreateInstance(type);
dingtieShowWin.Add(dingtie.FormName);
form.Tag = label.Tag;
form.Show();
这个根据名字打开窗体的直接使用数组记录 再次打开就会相当于重新new一个窗体了 那样就不符合需求了 他要求操作过的内容隐藏后再次打开别修改里面之前操作的内容
wuyq11 2011-01-21
  • 打赏
  • 举报
回复

public delegate bool EnumWindowsProc(IntPtr p_Handle, int p_Param);
[DllImport("user32.dll")]
public static extern int EnumWindows(EnumWindowsProc ewp, int lParam);
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowText(IntPtr hWnd, out STRINGBUFFER text, int nMaxCount);
[DllImport("user32.dll")]
public static extern bool IsWindowVisible(IntPtr hWnd);
[DllImport("user32.dll")]
public static extern IntPtr GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct STRINGBUFFER
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
public string szText;
}

private void button1_Click(object sender, EventArgs e)
{
MessageWindwos();
}

public void MessageWindwos()
{

EnumWindowsProc _EunmWindows = new EnumWindowsProc(NetEnumWindows);
EnumWindows(_EunmWindows, 0);
}

private bool NetEnumWindows(IntPtr p_Handle, int p_Param)
{
if (!IsWindowVisible(p_Handle))return true;

STRINGBUFFER _TitleString = new STRINGBUFFER();
GetWindowText(p_Handle, out _TitleString, 256);

MessageBox.Show(_TitleString.szText); ///获取的窗体

return true;
}
wuyq11 2011-01-21
  • 打赏
  • 举报
回复
System.Reflection.Assembly a = System.Reflection.Assembly.LoadFile(Application.ExecutablePath);//.net中的反射
Type[] types = a.GetTypes();

foreach (Type t in types)
{
if (t.BaseType.Name == "Form")
{
MessageBox.Show(t.Name);
}
}



deepmist 2011-01-21
  • 打赏
  • 举报
回复
FormCollection collection = Application.OpenForms;
这个只能获取打开的窗体名,不能获取隐藏的。

你可以用一个数组记录隐藏的窗体名称,然后再打开这些窗体
QIAN448043229 2011-01-21
  • 打赏
  • 举报
回复
我想要的效果是无论Visible等于true或者false都要能够获取到该窗口
QIAN448043229 2011-01-21
  • 打赏
  • 举报
回复
1楼的我问题描述已经说了 你的方法我试过了 隐藏了的窗口Application.OpenForms无法获取到啊
flyerwing 2011-01-21
  • 打赏
  • 举报
回复
好象不能获取吧.
没搞过.
sulei1000 2011-01-21
  • 打赏
  • 举报
回复
你是想让他显示还是用代码获取?
显示的话让其Visible=true

FormCollection collection = Application.OpenForms;

foreach(Form form in collection)
{
if(form.Visible == false)
form.Visible=true;
}

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧