【问题标题】:Convert an IntPtr window handle to IWin32Window^将 IntPtr 窗口句柄转换为 IWin32Window^
【发布时间】:2011-01-29 17:22:46
【问题描述】:

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

【问题讨论】:

    标签: c++-cli handle


    【解决方案1】:

    Control.FromHandle

    (这将为您提供实现 IWin32Window 接口的 Control 对象。)

    例如。

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

    请注意,这依赖于“从表单/控件的 Handle 属性获取”的句柄。您不能将此技术用于任意 Win32 窗口句柄。

    【讨论】:

    • James,我在您的答案中编辑了一个限定条件,因为从IntPtrIWin32Window 进行更一般搜索的人可能只会阅读问题标题,而不会理解问题细节中的限制。希望这没问题。
    • 不,这是一个很好的编辑。您可能使一些倒霉的未来程序员免于费时费力地想知道为什么他不能从原始 HWND 神奇地创建 Control/IWin32Window 对象。 :)
    【解决方案2】:

    .NET 框架直接支持一种更简单的方法,无需创建您自己的自定义类。您可以将它与 any 任意窗口句柄一起使用。

    给定 ptrWindowHandle 类型为 IntPtr

    using System.Windows.Forms;
    
    NativeWindow nativeWindow = new NativeWindow();
    nativeWindow.AssignHandle(ptrWindowHandle);
    

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

    【讨论】:

    • 你也可以只使用静态的NativeWindow.FromHandle(ptrWindowHandle);
    • @MattSmith 我发现它必须被分配。除非事先使用了 AssignHandle,否则 FromHandle 对我不起作用。例如,这可行:NativeWindow nativeWindow = new NativeWindow(); nativeWindow.AssignHandle(GetConsoleWindow()); box.ShowDialog(NativeWindow.FromHandle(GetConsoleWindow()));(甚至box.ShowDialog(nativeWindow);)...但是没有分配的这一行不行:box.ShowDialog(NativeWindow.FromHandle(GetConsoleWindow()));
    【解决方案3】:

    这似乎正是您所要求的。我自己从来没有做过,但它似乎相对简单:

    Creating a IWin32Window from a Win32 Handle

    祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      • 2012-10-04
      相关资源
      最近更新 更多