【问题标题】:Win32 API For Shutting Down Another Process Elegantly?Win32 API 优雅地关闭另一个进程?
【发布时间】:2009-02-03 06:35:44
【问题描述】:

我正在寻找一种方法来关闭另一个 Windows 应用程序。有没有办法做到这一点?

理想情况下,我想要基本上模仿 ALT-F4 的东西,或者按右上角的“X”或类似的东西。

或者,是否有一个应用程序已经这样做了? tskill 对于我的想法来说有点太苛刻了。

【问题讨论】:

    标签: winapi process shutdown


    【解决方案1】:

    编辑:我稍微挖掘了一下,发现了一个MSDN Article,使用的是微软推荐的方法。

    由于这是一个 Windows 应用程序,您可以将WM_CLOSE 消息发送到主窗口,但请记住,如果应用程序覆盖了对 WM_CLOSE 消息的处理,您可能会得到意想不到的结果。另外请记住,使用 TerminateProcessExitProcess 等 win32 函数也会产生令人不快的副作用(请参阅 msdn 上的备注部分),包括 dll 中的全局数据被泄露以及死锁。

    如果您负责编写目标应用程序,我建议您添加某种形式的内置终止机制,该机制可以在外部触发(例如,环回地址或管道上的魔术包),这样您就可以确保您的应用程序已清理适当地追随自己。

    【讨论】:

    • 指向 MSDN 文章的链接值得自己回答,所以我可以投票...
    【解决方案2】:

    根据您的描述,这听起来像是一个窗口应用程序。在这种情况下,您可以向其发送WM_CLOSE 消息以模仿按下“X”按钮时的行为。

    另一种选择是使用TerminateProcess,但这可能也是 tskill 的作用。

    【讨论】:

    • 好吧,基本上我希望它关闭 any 应用程序,如果可能的话,优雅地关闭。这可以是窗口应用程序、控制台应用程序等。控制台应用程序是否有等效项?
    • 窗口应用程序有一个消息循环,您可以利用它来发挥自己的优势。对于控制台应用程序,除了蛮力 TerminateProcess 之外,没有通用的解决方案。
    【解决方案3】:

    更强大的关闭应用命令是:

        PostMessage (myhnd,WM_ENDSESSION,TRUE,ENDSESSION_LOGOFF);
    

    【讨论】:

      【解决方案4】:

      我先推荐你my answer to another question;尽管它是关于 Delphi 和服务的,但答案既不是 Delphi 特定的,也不是特定于服务的。简而言之,没有通用的方法可以优雅地停止程序。该问题的公认答案展示了将wm_Close 消息发布到程序窗口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多