在 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的主要内容,如果未能解决你的问题,请参考以下文章