在 UWP 中从 CoreWindow 对象中获取 HWND

Posted

技术标签:

【中文标题】在 UWP 中从 CoreWindow 对象中获取 HWND【英文标题】:Getting HWND off of CoreWindow object in UWP 【发布时间】:2016-04-28 08:48:21 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

这个 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;

【讨论】:

谢谢。这似乎有效。我在 WindowHandle 属性中有一些价值。现在我需要弄清楚如何在 C# 的特定监视器中显示窗口。如果可能的话。 @gt6707a:如果答案解决了您的问题,您应该接受它。这使未来的访问者更容易浏览和识别相关信息。 问题是 - 你打算用那个 HWND 做什么?没有采用 HWND 的受支持 API。 我只是通过微软提供的子弹,将它们装入他的枪中由OP决定。 @gt6707a,你找到了吗?我真的很想看到您在特定显示器上显示 Window 的解决方案。如果您有时间,可以将您的解决方案发送至 ericouellet2@gmail.com【参考方案2】:

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

【讨论】:

其实想制作一个实用程序让用户以PIP模式(CompactOverlay)打开所有第三方UWP应用,有可能吗?适合有多任务需求的人。【参考方案3】:

没有受支持的 UWP API 接受 HWND

虽然通常 UWA 应用程序不应该对 HWND 进行推理,但有许多 WinRT API 支持接受 HWND 以支持从 Win32 应用程序使用。这是example 和another。 C# 客户端需要使用互操作技术,这里是 an example。

【讨论】:

以上是关于在 UWP 中从 CoreWindow 对象中获取 HWND的主要内容,如果未能解决你的问题,请参考以下文章

在UWP中从归档中提取特定文件

在 C# 中从后端发送 UWP 原始通知

UWP C++ 鼠标按钮向上事件无法始终如一地工作

如何在帖子中从 ViewComponent 获取对象?

我们如何在 Flutter 中从 JSON 对象中获取特定数据?

如何在 Swift 中从数据库中保存和获取一个对象?