将IntPtr窗口句柄转换为IWin32Window ^

sha*_*eMe 17 c++-cli handle

如何将从表单/控件的Handle属性获取的句柄转换为IWin32Window ^?

小智 23

Control.FromHandle

(这将获得Control对象,它实现了IWin32Window接口.)

例如.

IntPtr myWindowHandle = IntPtr(someVal);
IWin32Window^ w = Control::FromHandle(myWindowHandle);
Run Code Online (Sandbox Code Playgroud)

请注意,这依赖于"从表单/控件的Handle属性中获取"句柄.您不能将此技术与任意Win32窗口句柄一起使用.


Jim*_*mes 23

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

给定IntPtr类型的ptrWindowHandle:

using System.Windows.Forms;

NativeWindow nativeWindow = new NativeWindow();
nativeWindow.AssignHandle(ptrWindowHandle);
Run Code Online (Sandbox Code Playgroud)

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

  • 你也可以使用静态`NativeWindow.FromHandle(ptrWindowHandle);` (14认同)
  • @MattSmith我发现它必须被分配。FromHandle 不适用于我,除非事先使用了AssignHandle。例如,这有效:`NativeWindow nativeWindow = new NativeWindow(); nativeWindow.AssignHandle(GetConsoleWindow()); box.ShowDialog(NativeWindow.FromHandle(GetConsoleWindow()));` (甚至是 `box.ShowDialog(nativeWindow);`) ...但是没有赋值的这一行不会: `box.ShowDialog(NativeWindow. FromHandle(GetConsoleWindow()));` (3认同)

Mor*_*nar 7

这似乎正是你所要求的.我自己从未这样做过,但看起来相对简单:

从Win32句柄创建IWin32Window

祝好运!