C#关闭进程详解

一、通过进程名关闭进程

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


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

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/238726.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:12
下一篇 2024-12-12 12:12

相关推荐

  • 如何通过jstack工具列出假死的java进程

    假死的java进程是指在运行过程中出现了某些问题导致进程停止响应,此时无法通过正常的方式关闭或者重启该进程。在这种情况下,我们可以借助jstack工具来获取该进程的进程号和线程号,…

    编程 2025-04-29
  • Java中的僵尸进程简介与解决方法

    本文将对Java中的僵尸进程进行详细阐述,并给出几种解决方法。 一、僵尸进程的概念 在操作系统中,进程是指正在执行的程序。当一个进程创建了一个子进程,而该子进程完成了任务却没有被父…

    编程 2025-04-27
  • 多线程和多进程的应用

    多线程和多进程是现代编程中常用的技术,可以提高程序的效率和性能。本文将从不同的角度对多线程和多进程进行详细的介绍和应用。 一、多线程 vs 多进程 多线程和多进程都是为了实现程序并…

    编程 2025-04-27
  • Python多进程读取数据

    本文将从多个方面详细阐述在Python中如何通过多进程读取数据,并给出完整的代码示例。 一、多进程概述 在计算机科学中,进程是正在执行的程序实例。多进程是指计算机系统同时执行多个进…

    编程 2025-04-27
  • 进程a与进程b共享变量s1

    本文将从多个方面对进程a与进程b共享变量s1做详细的阐述,并给出代码示例。 一、定义全局变量s1 进程a与进程b共享变量s1,意味着s1是一个全局变量。在C语言中,可以使用关键字e…

    编程 2025-04-27
  • python多进程并行循环

    在大数据时代,我们通常需要处理大量的数据。处理大数据往往需要较长的时间,影响效率。Python提供了多线程、多进程等并行处理方式来提高数据处理效率。本文将主要讲解python多进程…

    编程 2025-04-27
  • Python进程池共享内存用法介绍

    本文将从多个方面详细阐述Python进程池共享内存的相关知识,包括如何使用进程池、进程池的实现原理、进程池中的共享内存管理等。本文内容将涵盖: 一、进程池的使用 进程池是一种有效的…

    编程 2025-04-27
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25

发表回复

登录后才能评论