如何从 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;
};
接下来,我们需要一个指向 CoreWindow
的 IUnknown
接口指针。有 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;
}
似乎有证据表明 HWND
会 fail Microsoft Store certification。如果这是一个问题,您将不得不找到不同的解决方案。
我有一个 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;
};
接下来,我们需要一个指向 CoreWindow
的 IUnknown
接口指针。有 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;
}
似乎有证据表明 HWND
会 fail Microsoft Store certification。如果这是一个问题,您将不得不找到不同的解决方案。