从HWND到控制

我使用user32.dll中的FindWindow方法找到一个窗口并获取句柄,但是可以从句柄中获取表单控件吗? 并使用它像一个普通的forms? 例:

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

或者我是否必须继续使用user32.dll中的方法向窗口发送消息?

如果它是一个托管窗口(您使用System.Windows.Forms创建它,并且它inheritance自System.Windows.Forms.Control),您可以获得对Control对象的引用

 Control.FromHandle(myIntPtr); 

然后你得到控件的父级,直到你得到表单。

如果没有,则无法获取Control对象,但您可以做的是创建NativeWindow,并使用AssignHandle将IntPtr句柄分配给对象。 这将至少为您提供一些WndProc的访问权限,类似,但就是这样。

你试过Control.FromHandle()吗? 表单是(inheritance自)控件。 如果您点击嵌套控件,则必须通过其父级搜索,直到您点击表单。

这假设某处实际存在Form ,并且您刚刚使用user32方法来定位其HWND

围绕Win32窗口句柄包装Form类非常困难。 Microsoft没有提供完整的实现。 因此,您必须仅使用Native函数与给定句柄进行通信。

如果窗口属于您的应用程序,则可以使用Control.FromHandle方法 。 否则你将不得不继续使用win api。 例如,要隐藏窗口,您需要调用ShowWindow函数。