如何从 CoreWindow 获取 ICoreWindowInterop

How to Get ICoreWindowInterop from CoreWindow

我有一个 C++/WinRT/UWP 项目。 我需要 HWND 和 HINSTANCE 才能正确初始化直接输入,否则 DirectInput 只管理枚举键盘和鼠标而不是操纵杆..不要问我为什么,我什至试图从 HInstance 得到 TopMostWindow GetModule,当来自我的 C++/WinRT/UWP 应用程序 运行 时,它只是 return NULL,但当来自控制台应用程序 运行 时它工作。

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

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

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

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

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

感谢您的帮助 干杯, 塞布

从这个document,它提到了如何获得HWND。首先使用 CoreWindow 查询 ICoreWindowInterop 接口,然后调用 get_WindowHandle 虚函数来获取应用程序的 HWND。我尝试把代码转成c++/winrt,大家可以看看

App.h

namespace XXXX
{
    MIDL_INTERFACE("45D64A29-A63E-4CB6-B498-5781D298CB4F")
        ICoreWindowInterop : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE get_WindowHandle(
            __RPC__deref_out_opt HWND * hwnd) = 0;

        virtual HRESULT STDMETHODCALLTYPE put_MessageHandled(
            boolean value) = 0;

    };

    struct App : AppT<App>
    {
        App();

        ......
    };
}

App.cpp

CoreWindow w = CoreWindow::GetForCurrentThread();
winrt::com_ptr<ICoreWindowInterop> interop;
winrt::check_hresult(winrt::get_unknown(w)->QueryInterface(interop.put()));

HWND hwnd;
winrt::check_hresult(interop->get_WindowHandle(&hwnd));

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

Kenny Kerr 多年前 (Windows 8, where’d you put my HWND?!) 写了一篇文章,详细介绍了所需的步骤。要在 C++/WinRT 应用程序中编译它,还需要做一些工作。

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

struct
__declspec(uuid("45D64A29-A63E-4CB6-B498-5781D298CB4F"))
__declspec(novtable)
ICoreWindowInterop : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE get_WindowHandle(HWND* hwnd) = 0;
    virtual HRESULT STDMETHODCALLTYPE put_MessageHandled(unsigned char value) = 0;
};

接下来,我们需要一个指向 CoreWindowIUnknown 接口指针。有 pre-built 功能作为免费功能 get_unknown。要使其编译,您必须 #include <Unknwn.h> 在包含任何 C++/WinRT headers.

之前

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

HWND from_core_window(CoreWindow const& window)
{
    winrt::com_ptr<ICoreWindowInterop> interop {};
    winrt::check_hresult(winrt::get_unknown(window)->QueryInterface(interop.put()));
    HWND hwnd {};
    winrt::check_hresult(interop->get_WindowHandle(&hwnd));
    return hwnd;
}

似乎有证据表明 HWNDfail Microsoft Store certification。如果这是一个问题,您将不得不找到不同的解决方案。