【问题标题】:Override Close Box on Windows 10 Universal Apps UWP覆盖 Windows 10 通用应用程序 UWP 上的关闭框
【发布时间】:2025-12-23 09:55:12
【问题描述】:

我试图通过单击应用程序窗口上的关闭框来防止应用程序被关闭。 例如,有一个未保存更改的文本编辑器,在按下关闭框时,我会首先显示“您要在退出前保存更改吗?”

如何检测想要关闭的应用并防止这种情况发生?

我正在使用 C++,这需要用于 Windows 10 通用应用程序 UWP。 我已经知道如何为 Win32 做到这一点。

【问题讨论】:

  • 我不认为你可以这样做,你只能对当时正在调用的应用程序暂停事件做出反应。
  • 这是可能的,因为 Microsoft Edge 浏览器是一个 UWP 应用,在某些情况下它支持这种行为。例如在 Facebook 聊天中,输入一些消息而不按回车(发送)并尝试关闭浏览器。这意味着它是可能的,我只是不知道如何。有什么帮助吗?
  • Edge 是第一方应用程序 - MS 可以使用其他人无法使用的 API。 msdn.microsoft.com/en-us/library/windows/apps/mt243287.aspx 明确表示没有应用关闭事件。

标签: c++ uwp windows-10 universal


【解决方案1】:

cmets 是正确的。常规的商店应用目前无法做到这一点。

但是,我们在 Creators Update(和相应的 SDK)中包含了一个预览 API,您现在可以查看该功能:

Windows.UI.Core.Preview.SystemNavigationManagerPreview 类提供了一个应用可以标记为已处理的 CloseRequested 事件。为了使活动正常运行,应用程序需要声明受限的“confirmAppClose”功能: https://docs.microsoft.com/en-us/windows/uwp/packaging/app-capability-declarations

请让我们知道您的反馈。

谢谢, Stefan Wick - Windows 开发者平台

【讨论】:

  • 感谢您提供令人兴奋的信息。我会等到 API 最终确定
  • 在 16299 sdk 中找不到“ConfirmAppClose”功能
  • @Snekithan:是的,自答案中提到的创作者更新以来,这一直可用。这是 MSDN 链接:docs.microsoft.com/en-us/uwp/api/…
  • 有没有办法从页面视图按钮触发 SystemNavigationManagerPreview.GetForCurrentView().CloseRequested() 事件,以引起与单击右上角的标准问题 X 相同的后续操作?我试过“Window.Current.Close();”它会生成一个“System.Runtime.InteropServices.COMException:'在意外时间调用了一个方法。不允许关闭主窗口。'”
  • CloseRequested 仅在用户发起关闭手势(例如单击 X 按钮)时触发。如果您想以编程方式关闭应用程序,您可以调用 Application.Shutdown()。如果您想要求用户确认,您可以在拨打电话之前进行确认。