我使用user32.dll中的FindWindow方法查找窗口并获取句柄,但是是否可以从句柄中获取表单控件?并使用它像一个普通的形式?例如:
int myhwnd = FindWindow(null, "MyWindow");
form myform = SomeMagic.GetFormFromHandle(myhwnd);
myform.Visible = false;
或者我是否必须继续使用user32.dll中的方法向窗口发送消息?
答案 0 :(得分:16)
如果它是一个托管窗口(您使用System.Windows.Forms创建它,并且它继承自System.Windows.Forms.Control),您可以使用
获取对Control对象的引用Control.FromHandle(myIntPtr);
然后你得到控件的父级,直到你得到表格。
如果没有,则无法获取Control对象,但您可以做的是创建NativeWindow,并使用AssignHandle将IntPtr句柄分配给对象。这至少会让你有机会访问WndProc,类似的,但就是这样。
答案 1 :(得分:2)
你试过Control.FromHandle()吗?表单是(继承自)控件。如果您点击嵌套控件,则必须通过其父级进行搜索,直到您点击表单。
这假设某处确实存在Form
,并且您刚刚使用user32方法找到其HWND
。
答案 2 :(得分:1)
围绕Win32窗口句柄包装Form类非常困难。 Microsoft没有提供完整的实现。因此,您必须仅使用Native函数与给定句柄进行通信。
答案 3 :(得分:1)
如果窗口属于您的应用程序,则可以使用Control.FromHandle Method。否则你将不得不继续使用win api。例如,要隐藏窗口,您需要调用ShowWindow Function.