一、通過進程名關閉進程
通過進程名字來關閉進程是最常用的一種方式。下面的代碼會先獲取所有當前正在運行的進程,然後查找指定的進程名,最後如果找到則關閉該進程
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
if (process.ProcessName == "processName")
{
process.Kill();
break;
}
}
以上代碼的核心是 Process.GetProcesses()
方法,它可以獲取到當前正在運行的所有進程。然後通過遍歷 Process
對象的 ProcessName
屬性來找到要關閉的進程,最後調用 Kill()
方法關閉進程
二、通過進程ID關閉進程
與通過進程名關閉進程類似,還可以通過進程ID來關閉進程。下面代碼會先獲取所有進程的ID,然後查找指定的進程ID,最後如果找到則關閉該進程
int processId = 1234; //指定進程ID
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
if (process.Id == processId)
{
process.Kill();
break;
}
}
以上代碼的核心是 Process.GetProcesses()
方法,它可以獲取到當前正在運行的所有進程。然後通過遍歷 Process
對象的 Id
屬性來找到要關閉的進程,最後調用 Kill()
方法關閉進程
三、通過進程句柄關閉進程
除了通過進程名關閉進程和通過進程ID關閉進程以外,還可以通過進程句柄來關閉進程。下面的示例代碼會先通過進程名獲取到進程句柄,然後如果找到則關閉該進程。
[DllImport("user32.dll")]
public static extern int EnumWindows(EnumWindowsProc ewp, int lParam);
[DllImport("user32.dll")]
public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
delegate bool EnumWindowsProc(IntPtr hWnd, int lParam);
bool GetWindowThreadProcessId(IntPtr hWnd, int lParam)
{
uint processId;
GetWindowThreadProcessId(hWnd, out processId);
if (processId == lParam)
{
return false;
}
return true;
}
Process[] processes = Process.GetProcessesByName("processName");
foreach (Process process in processes)
{
EnumWindowsProc enumProc = new EnumWindowsProc(EnumWindows);
EnumWindows(enumProc, process.Id);
if (process.HasExited)
{
continue;
}
process.Kill();
}
以上代碼的核心是 EnumWindows()
和 GetWindowThreadProcessId()
方法。首先通過 Process.GetProcessesByName()
來獲取指定進程名的所有進程,然後通過 EnumWindowsProc()
方法來枚舉所有窗口,最後通過 GetWindowThreadProcessId()
方法來獲取與窗口關聯的進程ID,如果與目標進程的ID相同,則關閉窗口所在的進程。
四、通過WMI服務關閉進程
除了上述三種方法之外,還可以使用Windows Management Instrumentation (WMI) 服務來關閉進程。下面的示例代碼會先獲取指定進程名的所有進程的詳細信息,然後通過查詢 Win32_Process
類中的 Terminate()
方法來關閉進程。
string processName = "processName";
string query = "SELECT * FROM Win32_Process WHERE Name='" + processName + "'";
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection processes = searcher.Get();
foreach (ManagementObject process in processes)
{
process.InvokeMethod("Terminate", null);
}
以上代碼的核心是 Win32_Process
類和 Terminate()
方法。首先通過構造一個 WQL
查詢字符串,然後使用 ManagementObjectSearcher
對象來執行查詢,得到一個 ManagementObjectCollection
對象表示所有符合條件的進程。然後通過遍歷 ManagementObjectCollection
中的每個進程,最後調用 Terminate()
方法來關閉進程。
五、通過SendKeys()方法關閉進程
除了以上四種方法,還可以使用 SendKeys()
方法來模擬用戶按下 Alt + F4
按鍵組合,從而關閉當前激活的窗口。下面是示例代碼
[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, uint wParam, uint lParam);
const uint WM_SYSCOMMAND = 0x112;
const uint SC_CLOSE = 0xF060;
string processName = "processName";
Process[] processes = Process.GetProcessesByName(processName);
foreach (Process process in processes)
{
int handle = FindWindow(null, process.MainWindowTitle);
SendMessage((IntPtr)handle, WM_SYSCOMMAND, SC_CLOSE, 0);
}
以上代碼的核心是 FindWindow()
和 SendMessage()
方法,其中 FindWindow()
方法可以找到指定窗口的句柄,而 SendMessage()
方法可以發送消息到指定窗口,這裡使用的兩個參數分別是 WM_SYSCOMMAND
和 SC_CLOSE
,表示發送 關閉窗口
消息。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/238726.html