2010-10-22 60 views
10

我使用User32.dll中的FindWindow方法来查找窗口并获取句柄,但是是否可以从句柄获取窗体控件?并用它像一个普通的形式?例如:从HWND到控制

int myhwnd = FindWindow(null, "MyWindow"); 
form myform = SomeMagic.GetFormFromHandle(myhwnd); 
myform.Visible = false; 

还是我必须继续使用user32.dll中的方法来发送消息到窗口?

回答

14

如果它是一个托管窗口(您使用System.Windows.Forms创建它,并且它已从System.Windows.Forms.Control继承),则可以获得参照控制对象

Control.FromHandle(myIntPtr); 

然后,您只需获得控件的父级,直到获取表单。

如果不是,则无法获取Control对象,但您可以执行的操作是创建NativeWindow,并使用AssignHandle将IntPtr句柄分配给该对象。这至少会给你一些访问WndProc和类似的东西,但就是这样。

1

在Win32窗口句柄周围包装Form类非常困难。微软没有提供完整的实施方案。所以,您必须使用Native函数才能与给定句柄进行通信。

2

你试过Control.FromHandle()?表格是(继承自)控件。如果你点击一个嵌套控件,你必须通过它的父母搜索,直到你点击你的表单。

这里假设实际上有一个Form的地方,并且您刚刚使用user32方法找到它的HWND