【问题标题】:How to detect if my Windows application has ended?如何检测我的 Windows 应用程序是否已结束?
【发布时间】:2016-12-23 06:47:25
【问题描述】:

基本上标题所说的我需要检测我的程序何时结束,例如当有人点击任务管理器中的结束任务或其他东西时。任何人都可以通过示例或其他方式向我指出某种处理此问题的事件吗?感谢您提供的任何帮助

【问题讨论】:

  • 如何启动程序?请向我们提供更多有关您想要实现的目标的背景信息。
  • 哪个进程应该收到这个信息?即将终止的进程,还是外部进程?
  • 这个问题已经被问过很多次了。你做过研究吗?

标签: c++ winapi events detect


【解决方案1】:

您需要打开此进程。这样,您将检索其句柄。之后,您可以简单地等待这个句柄。

HANDLE h = OpenProcess(....);
WaitForSingleObject(h);

进程和线程的句柄在许多方面看起来都像 Windows 事件句柄。一旦这个进程或线程完成,它们就会收到信号。

【讨论】:

  • 询问者正在被终止的进程中运行代码。所以这无济于事。
  • 首先,OP 不清楚这点。其次,一旦进程已经终止,应该有它曾经开始的地方的信息。至少在默认情况下,AFAIK Windows 不会保留此记录。
  • 如果问题不清楚,您应该发表评论要求澄清。
【解决方案2】:

这取决于您的应用是如何终止的以及它是什么类型的应用。

对于带有 UI 的应用:

  • 如果用户在任务管理器中单击“结束任务”,您实际上会收到 WM_DESTROY 甚至 WM_CLOSE 消息到您的消息处理程序。
  • 如果用户只是点击了您应用的 X 按钮,显然上述情况也适用。
  • 如果用户注销或关闭 PC,您将收到 WM_QUERYENDSESSION 和 WM_ENDSESSION 消息。

对于控制台应用程序,您可以使用 SetConsoleCtrlHandler 函数来通知大多数应用程序终止情况(我对此没有任何经验,因此无法提供很多细节)。

对于服务,您可以以几乎相同的方式使用 RegisterServiceCtrlHandler 函数。

对于所有类型的应用,如果应用被另一个进程通过TerminateProcess函数强行终止,there is no way to get notified

如果一个进程被 TerminateProcess 终止,则该进程的所有线程都将立即终止,没有机会运行其他代码。这意味着线程不会执行终止处理程序块中的代码。此外,不会通知附加的 DLL 进程正在分离。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多