C#关闭进程详解

发布时间:2023-05-18

通过进程名关闭进程

通过进程名字来关闭进程是最常用的一种方式。下面的代码会先获取所有当前正在运行的进程,然后查找指定的进程名,最后如果找到则关闭该进程

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_SYSCOMMANDSC_CLOSE,表示发送 关闭窗口 消息。