如何从 CoreWindow 获取 ICoreWindowInterop

Seb*_*Kun 1 uwp c++-winrt

我有一个 C++/WinRT/UWP 项目。我需要 HWND 和 HINSTANCE 才能正确初始化直接输入,否则 DirectInput 只能枚举键盘和鼠标,而不是操纵杆。不要问我为什么,我什至尝试从 HInstance 中获取 TopMostWindow GetModule,从我的 C++/WinRT/UWP 应用程序运行时它仅返回 NULL,但从控制台应用程序运行时有效。

文档https://learn.microsoft.com/en-us/windows/win32/api/corewindow/nn-corewindow-icorewindowinterop 我不知道如何将我的 CoreWindow 转换为 ICoreWindowInterop。CComPtr 不可用,并且在 C++/WinRT 中不可用,与 IUnkwnown 冲突。

在方法 App::OnLaunched(LaunchActivatedEventArgs const& e) 中,我得到这样的当前窗口

CoreWindow w = Window::Current().CoreWindow().GetForCurrentThread();

然后我不知道如何从中获取ICoreWindowInterop。CoreWindow 是一个 ICoreWindow ,但我在 Microsoft 文档中没有看到任何解释:/

我尝试强制转换并重新解释强制转换,但没有成功(编译错误)。我不是 COM/Windows 专家,所以我现在很迷茫。

感谢您的帮助干杯,Seb

IIn*_*ble 6

ICoreWindowInterop不能立即从. CoreWindow界面被隐藏,因此在使用时不会显示IInspectable\ 的内省时不会显示。您必须下拉到原始 COM 并显式查询该接口。

\n\n

Kenny Kerr 几年前写过一篇文章(Windows 8,where\xe2\x80\x99d you put my HWND?!),详细介绍了所需的步骤。要使其在 C++/WinRT 应用程序中进行编译,仍然需要做一些工作。

\n\n

首先,您必须声明接口ICoreWindowInterop。以下内容就足够了:

\n\n
struct\n__declspec(uuid("45D64A29-A63E-4CB6-B498-5781D298CB4F"))\n__declspec(novtable)\nICoreWindowInterop : public IUnknown\n{\n    virtual HRESULT STDMETHODCALLTYPE get_WindowHandle(HWND* hwnd) = 0;\n    virtual HRESULT STDMETHODCALLTYPE put_MessageHandled(unsigned char value) = 0;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

接下来,我们需要一个IUnknown指向CoreWindow. 有预构建的功能作为免费函数get_unknown。要对其进行编译,您必须#include <Unknwn.h>在包含任何 C++/WinRT 标头之前进行编译。

\n\n

一旦一切就绪,您就可以轻松获得HWND给定的CoreWindow实例:

\n\n
HWND from_core_window(CoreWindow const& window)\n{\n    winrt::com_ptr<ICoreWindowInterop> interop {};\n    winrt::check_hresult(winrt::get_unknown(window)->QueryInterface(interop.put()));\n    HWND hwnd {};\n    winrt::check_hresult(interop->get_WindowHandle(&hwnd));\n    return hwnd;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

似乎有证据表明,触及Microsoft Store 认证HWND将失败失败。如果这是一个问题,您将必须找到不同的解决方案。

\n