2010-03-20 268 views

回答

23

Control.FromHandle

(这可以让你控制的对象,它实现了IWin32Window接口。)

EG。

IntPtr myWindowHandle = IntPtr(someVal); 
IWin32Window^ w = Control::FromHandle(myWindowHandle); 

请注意,这依赖于“从窗体/控件的Handle属性获取的”句柄。你不能在任意的Win32窗口句柄中使用这种技术。

+0

James,我在你的答案中编辑了一个资格证书,因为来自对IntPtr和IWin32Window进行更全面搜索的人可能只会阅读问题标题而不理解问题细节中的约束条件。希望这没关系。 – itowlson 2010-03-20 04:21:21

+0

不,这是一个很好的编辑。你可能从几个小时的头脑中想起了为什么他不能奇迹般地从原始HWND创建一个Control/IWin32Window对象,从而挽救了一个倒霉的未来程序员。 :) – 2010-03-20 07:54:28

20

有一个更简单的方法,直接由.NET框架支持,而无需创建自己的自定义类。您可以使用任意任意窗口句柄。

鉴于ptrWindowHandle类型的IntPtr的:

using System.Windows.Forms; 

NativeWindow nativeWindow = new NativeWindow(); 
nativeWindow.AssignHandle(ptrWindowHandle); 

System.Windows.Forms.NativeWindow实现IWin32Window接口。

+14

你也可以使用静态'NativeWindow.FromHandle(ptrWindowHandle);' – 2013-01-24 16:23:22

+0

@MattSmith我发现它必须被分配。除非事先使用AssignHandle,否则FromHandle不适用于我。例如,这可以工作:'NativeWindow nativeWindow = new NativeWindow(); nativeWindow.AssignHandle(GetConsoleWindow()); box.ShowDialog(NativeWindow.FromHandle(GetConsoleWindow()));(甚至是'box.ShowDialog(nativeWindow);')...但是这个没有赋值的单行不包含:'box.ShowDialog(NativeWindow。 FromHandle(GetConsoleWindow()));' – Jay 2017-12-14 07:31:16