我有一个 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
ICoreWindowInterop不能立即从. CoreWindow界面被隐藏,因此在使用时不会显示IInspectable\ 的内省时不会显示。您必须下拉到原始 COM 并显式查询该接口。
Kenny Kerr 几年前写过一篇文章(Windows 8,where\xe2\x80\x99d you put my HWND?!),详细介绍了所需的步骤。要使其在 C++/WinRT 应用程序中进行编译,仍然需要做一些工作。
\n\n首先,您必须声明接口ICoreWindowInterop。以下内容就足够了:
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};\nRun Code Online (Sandbox Code Playgroud)\n\n接下来,我们需要一个IUnknown指向CoreWindow. 有预构建的功能作为免费函数get_unknown。要对其进行编译,您必须#include <Unknwn.h>在包含任何 C++/WinRT 标头之前进行编译。
一旦一切就绪,您就可以轻松获得HWND给定的CoreWindow实例:
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}\nRun Code Online (Sandbox Code Playgroud)\n\n似乎有证据表明,触及Microsoft Store 认证HWND将失败失败。如果这是一个问题,您将必须找到不同的解决方案。
| 归档时间: |
|
| 查看次数: |
1577 次 |
| 最近记录: |