我想终止一些进程,但我希望每个进程都有机会保存其数据,询问用户是否保存文件,甚至忽略关闭请求.
所以TerminateProcess
不可能,因为它立即杀死了这个过程.另一种方法是使用SendMessage
/ PostMessage
发送WM_CLOSE
到主窗口,不幸的是我不知道进程的窗户什么,我只有进程ID,所以FindWindow
没有帮助的.有没有其他方法可以找到进程的主窗口?
换句话说: 有没有办法像任务管理器点击" 结束任务 " 时那样优雅地终止任何进程?(而不是"结束过程")
Chr*_*cke 26
EnumWindows枚举进程中的所有顶级窗口.GetWindowThreadProcessId获取每个线程的进程和Id.
您现在有足够的信息可以正常关闭任何GUI应用程序.
您可以将WM_CLOSE
消息发送到您想要关闭的任何窗口.许多窗口处理WM_CLOSE
提示用户保存文档.您可以WM_QUIT
使用PostThreadMessage
已发现的线程发送消息以使消息循环终止.
用户代码不允许DestroyWindow
从不同的应用程序或线程调用到Windows ...如果应用程序没有响应WM_CLOSE
或WM_QUIT
请求您回到TerminateProcess
陆地.
这不会关闭控制台应用程序,因为应用程序进程和拥有该窗口的进程是不同的.
没有真正的方法可以在Windows上正常关闭控制台应用程序.他们需要支持某种优雅的关闭机制.
And*_*y E 15
我对win32 apis不太确定,但你可以shell执行taskkill
命令行功能.
taskkill /?
taskkill /pid 1230
taskkill /im notepad.exe
Run Code Online (Sandbox Code Playgroud)
/ f开关会强制终止但不使用它只是发送终止信号,以便应用程序正常关闭.
添加到Chris Becke关于终止优雅终止控制台进程的答案。
AttachConsole()附加到控制台应用程序并发送控制中断事件,类似于在命令提示符下按CTRL+ C。
使用GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT,processID)。
此控制事件应在控制台应用程序中处理以正常终止。
归档时间: |
|
查看次数: |
43260 次 |
最近记录: |