【发布时间】:2018-08-13 05:11:01
【问题描述】:
有没有办法在不使用Process.CloseMainWindow() 的情况下优雅地结束进程?
我想要结束的列表中有一堆进程。该进程应该在没有Process.Kill() 的情况下结束,以确保他们也清理并结束他们的子进程。
我尝试了CloseMainWindow,但不幸的是,它会让我的进程弹出一个消息框,上面写着“你真的要结束程序吗?”[是][否]我想避免。
进程有一个WM_QUERYENDSESSION 的消息处理程序,但是当我尝试向进程发送WM_QUERYENDSESSION 消息时,它没有反应。它只是对WM_QUIT 做出反应,但行为看起来像调用Process.Kill() 时的行为。
我还没有找到合适的解决方案。希望我没有忽略这里的事情......
【问题讨论】:
-
您是否能够与您的进程通信并告诉它们结束?这将是我能想到的最干净的解决方案。
-
根据您得出的结论,发送
WM_QUERYENDSESSION消息是个好主意?也不清楚,当调用Process.CloseMainWindow时会弹出什么消息。此外,为进程存储的“主窗口”只是一个猜测。很可能是错误的窗口。 -
您应该研究与您的应用程序的通信协议。通过您描述事物的方式,您似乎拥有两者的源代码。查看Inter Process Communication (IPC),我会建议Named Pipe Thread (NPT),因为我个人觉得它更干净,更容易实现。我使用 NPT 并将自定义 c# 对象传输到另一个应用程序,我可以在另一端读回它。
-
@Sefe 我有一些管道用于与子进程通信,但我无法想象没有解决方案可以从主进程结束它而不完全杀死它或“按下 X 按钮”。
-
有了编辑,解决方法就简单多了:去掉“你真的要结束程序吗”提示。用户只需按下 [Alt]+[F4],或单击关闭按钮。不要让他们两次回答同一个问题。