gpt4 book ai didi

winforms - 任务管理器中的“结束任务”始终设置 CloseReason.UserClosing

转载 作者:行者123 更新时间:2023-12-04 14:28:18 25 4
gpt4 key购买 nike

如果客户试图强制关闭应用程序,我想记录。我知道没有机会捕获进程终止。但是应该可以通过主窗体关闭事件来了解 'CloseReason.TaskManagerClosing' 原因。

但是我在 Windows 8.1 下所做的任何测试我总是得到一个 CloseReason.UserClosing 原因。但是在这种情况下(与法线 CloseReason.UserClosing 相比)我有大约 0.2 秒的时间来运行用户代码,然后我的程序被杀死了!

这是 Windows 8.1 中的新行为吗?

最佳答案

是的,我看到了这一点。是的,这是 Windows 更改,以前版本的任务管理器直接向窗口发送 WM_CLOSE 通知。我现在看到它发出与使用关闭按钮(WM_SYSCOMMAND、SC_CLOSE)关闭窗口时发出的完全相同的命令。或者按 Alt+F4 或使用系统菜单。所以 Winforms 不能再区分任务管理器和关闭窗口的用户之间的区别,你确实得到了 CloseReason.UserClosing。

接下来会发生什么是预料之中的,如果您没有足够快地响应关闭命令,那么任务管理器会使用 TerminateProcess() 立即暗杀您的程序。

请记住,当用户通过任务管理器中止程序时尝试保存数据是一种不好的做法。如果您的程序出现故障,您的用户通常会使用它,您不能再信任数据并且您冒着写垃圾的风险。现在,由于您的保存代码被中止,部分写入的文件或不再可用的 dbase 数据的高几率而使情况更加复杂。

对此没有简单的解决方法,修补 Windows 以恢复旧行为的可能性非常接近于零。以事务方式保存数据非常重要,这样在保存代码中止时就不会破坏有值(value)的数据。对文件数据使用 File.Replace(),对 dbase 写入使用 dbase 事务。

检测这种情况的一种不完美的方法是使用 Form.Deactivate 和 Activate 事件。如果您看到 Deactivate 事件并且 FormClosing 事件触发,那么另一个程序正在终止您的程序的可能性是合理的。

但是您处理这种情况的正常方式是常见的,如果用户在没有保存数据的情况下结束程序,那么您会显示一个对话框,询问是否保存数据。任务管理器确保这不会比这更进一步。

关于winforms - 任务管理器中的“结束任务”始终设置 CloseReason.UserClosing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22251027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com