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

如何在C++/WinRT中捕获并取消窗口关闭事件?

在C++/WinRT中捕获并取消窗口关闭事件的正确做法

刚好我之前也处理过这个场景,其实逻辑和你看到的C#示例本质一致,但在C++/WinRT里有几个细节要注意,避免踩坑:

首先,你得先给窗口的Closing事件绑定处理函数,然后在处理函数里通过事件参数来控制是否取消关闭。这里最关键的是事件参数的类型不能用通用的IInspectable,得用对应窗口的具体Closing事件参数类型——比如UWP/WinUI窗口对应的是Windows.UI.Xaml.WindowClosingEventArgs。

给你一个完整的示例代码:

1. 注册Closing事件

假设你已经有了窗口对象(比如m_mainWindow),在初始化的时候绑定处理函数:

// 假设这是你的窗口类成员初始化逻辑
winrt::Windows::UI::Xaml::Window m_mainWindow = winrt::Windows::UI::Xaml::Window::Current();
m_mainWindow.Closing({ this, &YourWindowClass::OnClosing });

2. 实现关闭事件处理函数

// 假设_allowClose是你自己定义的成员变量,用来控制窗口是否允许关闭
void YourWindowClass::OnClosing(winrt::Windows::Foundation::IInspectable const& sender, winrt::Windows::UI::Xaml::WindowClosingEventArgs const& args)
{
    // 根据业务逻辑判断是否取消关闭
    if (!_allowClose)
    {
        args.Cancel(true); // 注意!C++/WinRT里是调用Cancel方法,不是属性赋值,这和C#不一样
    }
}

几个要注意的点:

  • 你提到的示例里的_e.Cancel确实是笔误,正确的应该是针对事件参数调用Cancel方法(C++/WinRT里没有直接的属性赋值,而是通过方法来设置)
  • 一定要用具体的事件参数类型(比如WindowClosingEventArgs),如果用IInspectable的话,你还需要手动转换类型才能调用Cancel方法,非常麻烦
  • _allowClose可以是你根据业务场景设置的开关,比如用户还有未保存的修改时,把它设为false,就能阻止窗口关闭

内容的提问来源于stack exchange,提问作者user3743210

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:28:14