“关闭/ s”真的不会向正在运行的应用程序发送“关闭”信号吗?如果是这样,为什么?以及如何让它这样做?

Bit*_*tes 4 shutdown windows-10

请阅读这些:

https://bitcoin.stackexchange.com/questions/99273/why-has-bitcoin-core-stopped-shutting-down-when-windows-cleanly-shuts-down

https://github.com/bitcoin/bitcoin/issues/20052

我问了第一个,Github 问题是由其他人创建的,引用了我的 SE 问题。

他们声称 Windows 10 已损坏并且shutdown /s不会向正在运行的程序发送“关闭”信号。但这真的是真的吗?这似乎太愚蠢了,不可能是真的。如果是这样,它最近在 Windows 10 中一定发生了变化吗?

自然地,由于我不使用该/f标志来强制立即关闭,我希望该命令在用户以这种方式关闭机器时完全按照开始菜单执行的操作。但是这个关闭命令似乎只是在视觉上通知用户(这是无用的),而不是向正在运行的程序发送任何信号,并且在其内部超时(一分钟?)到时立即关闭。

这是 Windows 10 或 Bitcoin Core 中的错误吗?Bitcoin Core 开发人员似乎确信这是 Windows 的错,但这始终是 FOSS 开发人员的立场,而且 MS 在小更新中随机中断似乎很奇怪?

LMi*_*er7 9

shutdown /s不向应用程序发送关闭消息,因为这样做不是它的工作。该命令只是启动正常的 Windows 关闭程序,该程序执行任何必要的操作。

无论如何,发送关闭消息不会很有效。这与当您单击应用程序窗口上的关闭按钮时应用程序将收到的消息相同。它可以以任何它希望的方式处理这个问题。

它可以关闭应用程序。如果未采取任何特定操作,则这是默认操作。但是应用程序经常拦截这个消息。它可以提示用户保存任何打开的文件或自行执行此操作。它可以最小化对通知区域的应用。它可以要求用户确认关机。或者它什么也做不了。

Windows 所做的是向所有应用程序发送一条消息,提示 Windows 即将关闭,并且它们应该执行任何必要的操作。通常,应用程序会执行任何必要的清理操作,然后关闭。如果应用程序忽略此消息,或未及时回复,会话将结束。此时,应用程序无法停止该过程。

从提供的信息来看,没有理由怀疑是 Windows 问题。不发送此消息会产生重大后果,并且会在测试的早期被发现。我强烈怀疑这是一个应用程序问题。应用程序无法获得与 Windows 几乎相同级别的测试。

  • 简单地说,**这是一个不同的信息**。当系统关闭时,每个窗口都不会收到“WM_CLOSE”消息,而是会收到“WM_QUERYENDSESSION”消息,然后是“WM_ENDSESSION”消息。因此,应用程序仍然会收到挂起关闭的通知,并且可以相应地做出反应,无论该系统关闭是由“shutdown /s”还是任何其他路由启动。另请参阅:https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms700677 和 https://devblogs.microsoft.com/oldnewthing/20080421-00/?p=22663 (8认同)
  • 比较[比特币的代码](https://github.com/bitcoin/bitcoin/blob/99813a9745fe10a58bedd7a4cb721faf14f907a4/src/qt/winshutdownmonitor.cpp#L24)与[处理这些消息的正确方法](https://docs .microsoft.com/en-gb/previous-versions/windows/desktop/ms700677(v=vs.85)#best-practices-for-handling-shutdown-in-windows-vista)([进一步](https:/ /docs.microsoft.com/en-gb/windows/win32/shutdown/shutdown-changes-for-windows-vista))。 (6认同)

aci*_*nis 5

一般shutdown /s不发送任何“关闭”消息。它调用少数几个用于关闭 Windows 系统的 Win32 API 函数之一。

这些函数依次通过消息通知应用程序有关关闭/重新启动事件的WM_QUERYENDSESSION信息WM_ENDSESSION

然后,程序可以通过正确响应来同意或尝试阻止挂起的关闭WM_QUERYENDSESSION,例如。用于干净地停止等

因此,理论上在发出shutdown /s命令后,会有一些“关闭”消息发送到所有程序,您不需要为此执行任何特殊操作。

shutdown /s在某种程度上是特定的(或者有缺陷?),并且使 Windows 忽略响应,WM_QUERYENDSESSION因此 Bitcoin Core 无法以干净的方式关闭。我在 Windows 7 上看到了这种行为,正如链接的 GitHub 问题所示,Windows 10 也有这种行为。

这里的一个答案表明更多“正常”(例如从开始菜单)关闭是通过 PowerShellStop-Computer命令执行的。

在 API 级别,shutdown /s 将使用 InitiateShutdown API 之一(我不确定是哪一个),而 Stop-Computer 最有可能使用 ExitWindowsEx。当从交互式会话运行时,后者更合适。

就我个人而言,我在这种情况下从不信任 Windows,并手动停止任何重要程序。我什至读过一些关于 Windows 杀死应用程序(如果它们清理时间太长)的文章,但我现在找不到它。

您可以在此处阅读有关关闭程序的信息。

如果你想要的话,有一个我用来测试的要点。