1. 程式人生 > >win32根據程序名獲取程序ID或者終止程序

win32根據程序名獲取程序ID或者終止程序

第一部分:

根據程序名獲取程序ID。

首先我們需要了解三個windows API函式:

HANDLE WINAPI CreateToolhelp32Snapshot(
  DWORD dwFlags,
  DWORD th32ProcessID
);

CreateToolhelp32Snapshot函式可以得到系統程序快照的控制代碼,如果函式呼叫成功返回快照控制代碼,否則返回INVALID_HANDLE_VALUE。函式包含在<tlhelp32.h>頭中。

BOOL WINAPI Process32First(
  HANDLE hSnapshot,
  LPPROCESSENTRY32 lppe
);
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
);
BOOL TerminateProcess(
  HANDLE hProcess,
  UINT   uExitCode
);

例項如下:

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

相關推薦

win32根據程序獲取程序ID或者終止程序

第一部分: 根據程序名獲取程序ID。 首先我們需要了解三個windows API函式: HANDLE WINAPI CreateToolhelp32Snapshot( DWORD dwFlags, DWORD th32ProcessID ); CreateTo

【MFC】-005 根據程序獲取程序ID

【MFC】-005 根據程序名獲取程序ID 【MFC】-005 根據程序名獲取程序ID 1、由來 2、實現 3、注意 1、由來   在使用TrackIR5進行位姿跟蹤時,使用網上

linux根據埠號,或程序獲取程序pid

列出誰在使用某個埠 lsof -i :3306 lsof(list open files)是一個列出當前系統開啟檔案的工具。在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連線和硬體。11 [[email protected] w

根據程序獲取窗體

#include <windows.h> #include <tlhelp32.h> #include <stdio.h> #include <string> using namespace std; DWORD GetPro

程序獲取程序ID及其主執行緒ID

1 說明 Windows環境 此處程序名是指程序可執行檔案的名稱(工作管理員程序列表中顯示的映像名稱),如notepad.exe。 Windows中沒有直接可用的相關函式,實現思路為使用CreateToolhelp32Snapshot函式建立程序或執行緒快

linux 根據 程序 獲取 對應 PID 來 判斷 使用 記憶體情況

#!/bin/bashPID=$(ps -A |grep "java"| awk '{print $1}') if (( PID < 1 )) then /etc/init.d/elasticsearch restart fi cat /proc/$PID/stat

C++通過程序獲取程序控制代碼

記錄下一段,比較常用的程式碼。 // 強殺定期刪除程序 void CDogThread::Quit() { // 結束強殺定期刪除程序 HANDLE hProcess = GetProcessHa

AutoIt3 使用程序獲取視窗控制代碼

背景 需要用AutoIt3控制QQ音樂播放器,首先要獲取QQ音樂的視窗控制代碼 問題 WinGetHandle方法不能滿足要求 QQ音樂的Title會根據當前播放的歌曲動態改變

通過程序獲取程序PID

/*用CreateToolhelp32Snapshot進行對系統所有程序進行快照,然後利用Process32First取得第一個程序控制代碼,然後把得到的PROCESSENTRY32結構體中的szExeFile就是程序名進行比較,利用Process32Next進行迴圈比較,具

java 反射機制--根據屬性獲取屬性值

obj popu null tail tools pop 對象 href pro 1.考慮安全訪問範圍內的屬性,沒有權限訪問到的屬性不讀取 [java] view plain copy /** * 根據屬性名獲取屬性值 * *

** * 根據屬性獲取屬性值 * * @aram fie理直氣壯休假去高薪亦難換

jar 擴展 初始 task 圖片 休假 北京 不同 public Allure 是一個reor框架,支持多語言,多平臺。可以通過JuniTesngyes等產生的結果集生成酷炫好看的reor;同時也可以支持自定義字段,將你想展示 本文基於幾篇經典的論文,對 Aenion 模

python 根據標籤獲取標籤內容

import re import json import requests from bs4 import BeautifulSoup import lxml.html from lxml import etree result = requests.get('http://example.w

安卓高德地圖API根據城市獲取對應的經緯度和地理編碼

private void getLatlon(String cityName){ GeocodeSearch geocodeSearch=new GeocodeSearch(con

【程式】Windows下根據計算機獲取IP地址的C語言程式

方法一(當指定的裝置不存在時,有可能返回的是本機的IP地址,所以不建議使用): #include <stdio.h> #include <WinSock2.h> #pragm

根據主機獲取PC的IP地址

<?php$host_name=array();for($i=1;$i<=6;$i++){ $host_name[$i]="pc".$i;      //所在區域網的PC由PC1~PC6命名

利用Java反射根據屬性獲取物件值和型別程式碼

/**      * 通過屬性名獲取物件值      * @param mp 要操作的物件 這裡以MoveProgress 為例子      * @param vill  要獲取值的欄位名      * @return      * @throws Exception   

根據計算機獲取其IP

Dim ControllerInfo As IPHostEntry = Dns.GetHostByName(controllerName) Dim Controller

sql根據獲取欄位及對應說明型別長度

 SELECT "表名" = OBJECT_NAME(c.object_id), "列名" = c.name, "描述"= ex.value, "型別"=t.name, "長度"=c.max_length FROM sys.columns c LEFT OU

SQL獲取SQL Server 根據獲取表的所有列及屬性

select     c.name as [欄位名],t.name as [欄位型別]     ,convert(bit,c.IsNullable)  as [可否為空]     ,convert(bit,case when exists(select 1 from sysobjects where xty

根據印表機獲取印表機相關引數

 unit Unit1; interface uses   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,   Vcl.Co