如何在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
相关产品推荐
相关产品推荐

