在 UWP 中获取 HWND 从 CoreWindow 对象中获取

本文关键字:获取 CoreWindow 对象 HWND UWP | 更新日期: 2023-09-27 18:31:19

这个简短的MSDN文档说CoreWindow具有ICoreWindowInterop,它可以获取CoreWindow的句柄HWND。但是我找不到有关如何获取它的参考资料(C#)。请帮忙。

https://msdn.microsoft.com/en-us/library/dn302119(v=vs.85).aspx

在 UWP 中获取 HWND 从 CoreWindow 对象中获取

此 COM 接口只能由C++代码直接访问。 在 C# 中,您必须自己声明它,并使其与 C:''Program Files (x86)''Windows Kits''10''Include''10.0.10586.0''winrt''CoreWindow.idl 中的接口声明匹配。 喜欢这个:

using System.Runtime.InteropServices;
...
    [ComImport, Guid("45D64A29-A63E-4CB6-B498-5781D298CB4F")] 
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    interface ICoreWindowInterop {
        IntPtr WindowHandle { get; }
        bool MessageHandled { set; }
    }

获取接口引用需要强制转换,编译器不允许直接从 CoreWindow 对象强制转换。 通过让 DLR 完成工作最容易完成,如下所示:

    dynamic corewin = Windows.UI.Core.CoreWindow.GetForCurrentThread();
    var interop = (ICoreWindowInterop)corewin;
    var handle = interop.WindowHandle;
请注意,

UWP 不支持接受 HWND 的 API。你调用的任何 API 都将无法通过 Windows 应用商店认证,即使你避免使用 Windows 应用商店(例如,旁加载或通过企业部署),也不能保证该应用将来会正常工作。

UWP 没有受支持的接受 HWND 的 API

虽然通常 UWA 应用不应推理 HWND,但有许多 WinRT API 支持接受 HWND 以支持从 Win32 应用使用。这是一个例子和另一个例子。C# 客户端需要使用互操作技术,下面是一个示例。