当前位置:C++技术网 > 资讯 > 通过进程名字关闭进程

通过进程名字关闭进程

更新时间:2015-06-23 20:50:43浏览次数:1+次

    代码:
    使用前,需要包含头文件,#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。