如何优雅地终止进程?

Dan*_*ski 37 winapi process

我想终止一些进程,但我希望每个进程都有机会保存其数据,询问用户是否保存文件,甚至忽略关闭请求.

所以TerminateProcess不可能,因为它立即杀死了这个过程.另一种方法是使用SendMessage/ PostMessage发送WM_CLOSE到主窗口,不幸的是我不知道进程的窗户什么,我只有进程ID,所以FindWindow没有帮助的.有没有其他方法可以找到进程的主窗口?

换句话说: 有没有办法像任务管理器点击" 结束任务 " 时那样优雅地终止任何进程?(而不是"结束过程")

Chr*_*cke 26

EnumWindows枚举进程中的所有顶级窗口.GetWindowThreadProcessId获取每个线程的进程和Id.

您现在有足够的信息可以正常关闭任何GUI应用程序.

您可以将WM_CLOSE消息发送到您想要关闭的任何窗口.许多窗口处理WM_CLOSE提示用户保存文档.您可以WM_QUIT使用PostThreadMessage已发现的线程发送消息以使消息循环终止.

用户代码不允许DestroyWindow从不同的应用程序或线程调用到Windows ...如果应用程序没有响应WM_CLOSEWM_QUIT请求您回到TerminateProcess陆地.

这不会关闭控制台应用程序,因为应用程序进程和拥有该窗口的进程是不同的.

没有真正的方法可以在Windows上正常关闭控制台应用程序.他们需要支持某种优雅的关闭机制.

  • 这是否可以在没有窗口即控制台的情况下关闭进程? (4认同)
  • 如果流程没有窗口怎么办?假设它是后台驱动程序监控任务,托盘中有一个图标.如果我们自己开发该过程会怎么样,这意味着除了将WM_CLOSE发送到Windows API中的窗口之外?是使用Windows套接字的唯一方法吗? (3认同)
  • 是 - TaskManager向应用程序发送"WM_CLOSE"消息.实际上我认为它可能会发送一个`WM_SYSCOMMAND`,`SC_CLOSE`消息. (2认同)

And*_*y E 15

我对win32 apis不太确定,但你可以shell执行taskkill命令行功能.

taskkill /?
taskkill /pid 1230
taskkill /im notepad.exe
Run Code Online (Sandbox Code Playgroud)

/ f开关会强制终止但不使用它只是发送终止信号,以便应用程序正常关闭.

  • 不幸的是,这仅适用于Windows XP Professional或更高版本.(甚至不是XP家庭),但我也需要Windows 2000和XP Home的功能.但我很想看到该工具的源代码:) (4认同)

She*_* 蒋晟 13

请参阅MSKB Q178893 如何在Win32中"干净地"终止应用程序

  • 您还应该在此处写下一些内容,以防页面被关闭/移动. (10认同)
  • 链接目前已关闭。 (3认同)

T.s*_*run 6

添加到Chris Becke关于终止优雅终止控制台进程的答案。

AttachConsole()附加到控制台应用程序并发送控制中断事件,类似于在命令提示符下按CTRL+ C

使用GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT,processID)。

此控制事件应在控制台应用程序中处理以正常终止。