从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函数。