代码:
使用前,需要包含头文件,#include <Tlhelp32.h>,否则CreateToolhelp32Snapshot等函数不可用。
LPCTSTR Name = _T("notepad.exe");//指定程序名称
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//创建帮助工具快照句柄
HANDLE hProcess = NULL;
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return;//失败则返回
}
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk;
for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
{
//循环遍历查找给定的名字的进程
if (!_tcscmp(pe.szExeFile, Name))
{
CloseHandle(hSnapshot);//找到之后,关闭快照资源
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe.th32ProcessID);//通过这个进程名字对应的进程ID得到进程的句柄
}
}
if(TerminateProcess(hProcess,0))
{
MessageBox(_T("关闭成功!"));
}
else
{
LPVOID lpMsgBuf; // 接受内部分配的消息缓存的内存地址
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | //使用内部分配内存
FORMAT_MESSAGE_FROM_SYSTEM | //从系统查找错误描述
FORMAT_MESSAGE_IGNORE_INSERTS,//忽略含%占位符的消息
NULL,//NULL表示从系统获取消息描述来源
GetLastError(),//获取上次出错的错误码
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 使用默认语言
(LPTSTR) &lpMsgBuf,//存放消息缓存地址
0,//如果没有设置FORMAT_MESSAGE_ALLOCATE_BUFFER内部分配缓存,则要指定外部缓存的大小,指定了设为0即可
NULL //格式化到%参数中的消息变量列表
);
::MessageBox( NULL, (LPCTSTR)lpMsgBuf, _T("错误提示"), MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
}
详细代码如上,直接可以使用。
此方法的原理在于借助API函数的Toolhelp系列的函数来实现。CreateToolhelp32Snapshot函数用来创建这个帮助工具,然后通过这个工具可以得到每一个进程信息,包括名字。然后比对输入的名字和搜索到的进程的名字,如果匹配,然后再得到相应的进程ID,然后借助ID得到进程的句柄(详细解释见《使用ID获得进程句柄的方法》文章),最后才能通过进程句柄来关闭进程。
其中的函数的具体用法,在此就不描述了,请自行查阅MSDN。