通常,最理想的状态是让程序自己结束。当过程正常退出时,会调用ExitProcess()函数。使用调用SendMessage()函数发送WM_CLOSE消息到目标窗口的 *** 将使程序正常结束并退出。本文介绍了类似任务管理器的功能,并强制结束了指定的过程。
1. 结束指定过程的示例代码
解释如何通过结束记事本来结束其他过程。结束记事本过程的代码如下:
编译连接上述程序,然后打开一个空的记事本程序,操作编译程序,会发现记事本程序的过程已经结束,这里的程序弹出一个简单的对话框,提示“结束过程成功”。
2. 结束过程所需API函数说明
在上述程序代码中,结束过程API共有4个函数,分别是FindWindow()、GetWindowThreadProcessId()、OpenProcess()和TerminateProcess()。
GetWindowThreadProcessId()函数的定义如下:
参数说明如下。
hWnd:代码中的窗口句柄是 FindWindow()函数获取。
lpdwProcessId:这个参数是指向 DWORD 类型的指针,用户返回窗口句柄所对应的进程 ID。
GetWindowThreadProcessId()函数在获得过程中ID 之后,进程 ID 传递给 OpenProcess() 函数获得过程中的句柄。OpenProcess()函数的定义如下:
参数说明如下。
dwDesiredAccess:为了方便打开进程获得的访问权限,参数可以永远是 PROCESS_ALL_ACCESS。
bInheritHandle:指定获得的句柄能否继承,一般选择不继承,传递值为 FALSE。
dwProcess:指定打开的过程 ID 号,这个过程 ID 号是由 GetWindowThreadProcessId()获得的。
该函数的返回值为过程中的句柄,可通过此句柄调用 TerminateProcess()函数结束。TerminateProcess()函数的定义如下:
参数说明如下。
hProcess:为了结束过程的过程句柄,句柄已经通过 OpenProcess()获得函数。
uExitCode:退出代码的过程 0 值。
通过一些列API函数完成了一个完成过程的程序。完成程序的之一步是获得窗口的句柄。如果没有窗口,是否没有办法通过程序完成过程?事实上,还有办法。
从上面的3个API从函数中可以看出,过程可以通过过过程窗口得到ID,通过进程的ID可以得到过程的句柄。它们本身是相关的。因此,当需要使用相关资源时,如果不能直接获得,不妨以这种方式逐步获得。