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

第一部分:

根据进程名获取进程ID。

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

HANDLE WINAPI CreateToolhelp32Snapshot(
  DWORD dwFlags,
  DWORD th32ProcessID
);

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

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;//返回 
 }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(window应用程序)