通过进程名关闭进程
通过进程名字来关闭进程是最常用的一种方式。下面的代码会先获取所有当前正在运行的进程,然后查找指定的进程名,最后如果找到则关闭该进程
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
,表示发送 关闭窗口
消息。