高手进入(在线等候):如何解决动态查找窗体的问题!

weifj 2003-10-15 02:58:02
如何在应用程序域内动态找到某个类型的窗体实例(如Form1类的实例frm),而又不想使用初始变量记载frm。
例如:点击Button1时显示Form1实例frm,但再次点击Button1时判断是否有Form1的实例存在,如果存在则不显示窗体。只是修改已经打开的窗体的标题为【第i个窗体】。
注意:不想使用初始变量记载Form1实例frm,要动态判断是否有Form1的实例存在,而不知道frm,之后再捕获Form1的实例。
...全文
45 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
weifj 2003-10-17
  • 打赏
  • 举报
回复
并不是使用的MDI窗体。
weifj 2003-10-17
  • 打赏
  • 举报
回复
谢了!我已经写出来了,使用的是Win32API函数。如下:private const int GW_Child = 5;
private const int GW_HWNDFIRST = 0;
private const int GW_HWNDLAST = 1;
private const int GW_HWNDNEXT = 2;
private const int GW_HWNDPREV = 3;
private System.Windows.Forms.Button button2;
private const int GW_OWNER = 4;


[DllImport("user32.dll")]
private extern static System.IntPtr GetWindow(System.IntPtr hWnd,int wCmd);

[DllImport("user32.dll")]
private extern static System.IntPtr GetDesktopWindow () ;

[DllImport("user32.dll")]
private extern static int GetWindowText(System.IntPtr hWnd,System.Text.StringBuilder lpString,int nMaxCount);

[DllImport("user32.dll")]
private extern static int GetWindowTextLength(System.IntPtr hWnd);

[DllImport("user32.dll")]
private extern static int GetClassName(System.IntPtr hWnd,System.Text.StringBuilder lpClassName,int nMaxCount);

private void button2_Click(object sender, System.EventArgs e)
{
System.Text.StringBuilder text = new System.Text.StringBuilder(256);
System.IntPtr LastHwnd = System.IntPtr.Zero ;
System.IntPtr CurHwnd = GetDesktopWindow() ;
CurHwnd = GetWindow(CurHwnd, GW_Child);
do
{
if (CurHwnd==System.IntPtr.Zero ) break;
GetWindowText(CurHwnd,text,128);
if(text.ToString().ToUpper()=="目标窗体的标题")
{
//Form2类:从System.Windows.Forms.Form派生的窗体类,其中定义了共有实例方法ShowText。
Form2 f = (Form2)System.Windows.Forms.Form.FromHandle(CurHwnd);
f.ShowText("Find Form2.");
break;
}
CurHwnd = GetWindow(CurHwnd, GW_HWNDNEXT);
} while(true);
}
wangj2001 2003-10-15
  • 打赏
  • 举报
回复
public void showMdiChild(System.Windows.Forms.Form MdiChildForm)
{
int i;
Form[] frmForms = this.MdiChildren;
bool btrue=false;

Cursor.Current=Cursors.WaitCursor;

for (i=0; i<frmForms.Length; i++)
{
//窗体类实例转换成字符串时相同,说明是同一个实例
if (frmForms[i].ToString()==MdiChildForm.ToString())
{
MdiChildForm.Dispose(); //释放刚创建的子窗体的实例资源
this.MdiChildren[i].Activate(); //将已经创建的实例窗体激活

btrue=true;
}
}
//如果i等于窗体数组的长度,
//说明上面的循环完成后没有找到窗体实例与传过来的窗体实例相同,
//说明新创建的窗体没有被创建过,那么就把它显示出来
if(btrue==false)
{
MdiChildForm.MdiParent = this; //指定窗体的MDI父窗体
MdiChildForm.Show();
if(MdiChildForm.MaximizeBox ==false)
{
MdiChildForm.WindowState = FormWindowState.Normal ;
MdiChildForm.StartPosition =FormStartPosition.CenterScreen;
}
else
MdiChildForm.WindowState = FormWindowState.Maximized ;
}

if(this.MdiChildren.Length>0)
{
panelMain.Hide ();
bShowBtn=false;
}
Cursor.Current =Cursors.Default ;
}

110,502

社区成员

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

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

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