WinUI3中如何从HWND、WindowId或AppWindow获取winrt::Microsoft.UI.Xaml::Window?
WinUI 3:从HWND窗口获取Window对象
问题
我在WinUI 3应用里用CreateWindowEx创建了原生窗口,没有对应的Window实例。现在能通过窗口句柄拿到WindowId和AppWindow,但找不到从这些资源获取Window对象的官方方法。
解决方案
WinUI 3没有提供直接从HWND或AppWindow反向获取Window的API,因为Window是XAML的封装层,和原生HWND的关联需要手动维护。可以按以下步骤处理:
- 手动关联Window与HWND
创建HWND后,实例化Window对象并将其与AppWindow绑定,同时维护一个映射表存储HWND和Window的对应关系:
// 已通过CreateWindowEx获取hwnd auto windowId = winrt::Microsoft::UI::WindowId::GetFromWindow(hwnd); auto appWindow = winrt::Microsoft::UI::Windowing::AppWindow::GetFromWindowId(windowId); // 创建并配置Window对象 winrt::Microsoft::UI::Xaml::Window xamlWindow; xamlWindow.Content(/* 加载你的XAML内容 */); xamlWindow.AppWindow(appWindow); // 存入全局/可访问的映射表,比如用std::unordered_map static std::unordered_map<HWND, winrt::Microsoft::UI::Xaml::Window> s_hwndToWindow; s_hwndToWindow[hwnd] = xamlWindow;
- 通过HWND查询Window
后续需要使用Window时,直接从映射表中查询:
auto iter = s_hwndToWindow.find(hwnd); if (iter != s_hwndToWindow.end()) { auto targetWindow = iter->second; // 对targetWindow执行操作 }
注意事项
Window是WinUI 3对原生窗口的高层封装,原生HWND不会自动关联到XAML的Window实例,因此必须手动维护映射关系,这是当前官方无直接API情况下的可行方案。
内容的提问来源于stack exchange,提问作者ACGMN
相关产品推荐
相关产品推荐

