2010-01-13 103 views
32

我想终止许多进程,但我想让每个进程都有机会保存它的数据,询问用户保存文件甚至忽略关闭请求。如何正常终止进程?

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

换句话说: 有什么办法终止任何过程正常,就像任务管理器,当你点击“结束任务”? (而不是“结束进程”)

+0

我认为 “任务” 是顶层(可视)窗口。所以,'WM_CLOSE'将被发送(可能)在终止任务上。 – 2010-01-13 10:45:55

+0

如果您不是软件开发人员 - 只是Windows用户 - 请参阅[相关超级用户如何正常询问正在运行的应用程序终止问题](http://superuser.com/questions/959364/on-windows-如何-可以-I-优雅-ASK-A-进程到终止)。 – unforgettableid 2015-08-19 02:33:21

+0

请注意,从Windows 8.1起,任务管理器的“结束任务”按钮现在强行终止所选应用程序,并导致您丢失任何未保存的工作。你可能想编辑你的问题,以反映这一点。 – unforgettableid 2015-08-20 12:44:41

回答

22

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

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

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

用户代码不允许调用DestroyWindow从不同的应用程序或线程到Windows ...如果应用程序不给你回TerminateProcess土地WM_CLOSEWM_QUIT请求作出回应。

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

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

+0

当我拥有该进程的所有窗口时,是否会向每个顶级窗口发送一个“WM_CLOSE”? – 2010-01-13 10:08:09

+0

正是我要说的。 +1。 – 2010-01-13 10:09:04

+2

是的 - TaskManager发送一个WM_CLOSE消息给应用程序。其实我认为它可能会发送一个'WM_SYSCOMMAND','SC_CLOSE'消息。 – 2010-01-13 13:13:09

15

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

taskkill /? 
taskkill /pid 1230 
taskkill /im notepad.exe 

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

+4

不幸的是,这只适用于Windows XP Professional或更新版本。 (甚至没有家XP),但我也需要Windows 2000和XP Home的功能。但我很想看到该工具的源代码:) – 2010-01-13 10:09:46

13
+0

+1。克里斯贝克的解决方案重叠了很多,并介绍了处理16位应用程序的角落案例。尼斯。 – 2010-01-15 02:57:35

+9

你也应该在这里写一些内容,以防止页面被移动/移动。 – MasterMastic 2013-04-02 14:58:45

+0

链接只有答案不是很好的答案。请按照MasterMastic的建议去做,并将实质性内容放在这个答案中。 – 2018-01-08 17:17:54

1

使用EndTask API函数。这与任务管理器使用的功能相同。

BOOL EndTask(  
    HWND hWnd, 
    BOOL fShutDown, 
    BOOL fForce 
); 

http://msdn.microsoft.com/en-us/library/ms633492(VS.85).aspx

+7

该页面第一行文字说:* [此功能不适合一般用途。在Windows的后续版本中可能会更改或不可用。] *。也许upvoters没有点击通过? – Jon 2011-06-26 22:59:42

+2

@Jon很多api都有这样的提示,但许多问题不能在不使用它们的情况下解决。这同样适用于“无证”的。 (我不是说这是这种情况之一) – 2014-10-17 12:02:58