win32根据进程名获取进程ID或者终止进程

本文介绍了如何在Win32环境下通过进程名称获取进程ID以及终止进程。首先,使用CreateToolhelp32Snapshot获取系统进程快照句柄,接着用Process32First和Process32Next遍历进程。为了终止进程,需要OpenProcess打开指定进程并调用TerminateProcess进行结束操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一部分:

根据进程名获取进程ID。

首先我们需要了解三个windows API函数:

HANDLE WINAPI CreateToolhelp32Snapshot(
  DWORD dwFlags,
  DWORD th32ProcessID
);

CreateToolhelp32Snapshot函数可以得到系统进程快照的句柄,如果函数调用成功返回快照句柄,否则返回INVALID_HANDLE_VALUE。函数包含在<tlhelp32.h>头中。

BOOL WINAPI Process32First(
  HANDLE hSnapshot,
  LPPROCESSENTRY32 lppe
);

Process32First函数查找系统进程快照中的第一个进程。

BOOL WINAPI Process32Next(
  HANDLE hSnapshot,
  LPPROCESSENTRY32 lppe
);

Process32Next函数配合Process32First函数通过循环列出系统中其它进程。

查找特定进程的ID的函数如下所示:

/*
*@brief 根据进程名获取进程ID
@param lpProcessName进程名称
*/
DWORD __getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID 
{
	DWORD dwRet = 0;
	HANDLE hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hSnapShot == INVALID_HANDLE_VALUE)
	{
		printf("\n获得进程快照失败,返回的GetLastError():%d", ::GetLastError());
		return dwRet;
	}

	PROCESSENTRY32 pe32;//声明进程入口对象 
	pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小 
	::Process32First(hSnapShot, &pe32);//遍历进程列表 
	do
	{
		if (!lstrcmp(pe32.szExeFile, lpProcessName))//查找指定进程名的PID 
		{
			dwRet = pe32.th32ProcessID;
			break;
		}
	} while (::Process32Next(hSnapShot, &pe32));
	::CloseHandle(hSnapShot);
	return dwRet;//返回 
}

 

第二部分

通过进程名来终止进程。

还是通过上面三个函数来查找特定的进程,不过还需要另外两个函数:

HANDLE OpenProcess(
  DWORD dwDesiredAccess,
  BOOL  bInheritHandle,
  DWORD dwProcessId
);

OpenProcess函数用来打来一个进程。

BOOL TerminateProcess(
  HANDLE hProcess,
  UINT   uExitCode
);

TerminateProcess用来终止给定的进程。

实例如下:

/*
 *@brief 根据进程名终止进程
 @param lpProcessName进程名称
 */
 BOOL __getProcessHandle(LPCTSTR lpProcessName)//根据进程名查找进程PID 
 {
	 BOOL processExist = true;
	 HANDLE hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	 if (hSnapShot == INVALID_HANDLE_VALUE)
		 return processExist;
	 PROCESSENTRY32 pe32;//声明进程入口对象 
	 pe32.dwSize = sizeof(PROCESSENTRY32);//填充进程入口对象大小 
	 ::Process32First(hSnapShot, &pe32);//遍历进程列表 
	 do
	 {
		 if (!lstrcmp(pe32.szExeFile, lpProcessName))//查找指定进程名的PID 
		 {
			 HANDLE hGUI = OpenProcess(PROCESS_ALL_ACCESS, true, pe32.th32ProcessID);
			 if (NULL == hGUI)
				 return processExist;
			 TerminateProcess(hGUI, 0);
			 processExist = false;
			 break;
		 }
	 } while (::Process32Next(hSnapShot, &pe32));
	 ::CloseHandle(hSnapShot);
	 return processExist;//返回 
 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值