You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的关联需要手动维护。可以按以下步骤处理:

  1. 手动关联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;
  1. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 12:42:19