从HWND到控制

时间:2010-10-22 11:58:49

标签: c# winforms

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

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

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

4 个答案:

答案 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.