📌  相关文章
📜  C# 程序检查正在运行的进程是否为 64 位进程或不使用环境类(1)

📅  最后修改于: 2023-12-03 15:13:52.381000             🧑  作者: Mango

使用C#检查进程是否为64位进程或不使用环境类

在C#中,我们可以使用System.Diagnostics.Process类来检查正在运行的进程的相关信息,包括位数、名称、ID等。然而,需要注意的是,对于64位进程的判断,使用Environment类的方法有可能会出现错误,因为它只能检测当前程序运行的位数,而无法检查指定进程的位数。

因此,我们在本篇文章中介绍一种可行的方法,使用WMI类来查找进程相关信息,实现动态判断进程是否为64位进程或不使用环境类。下面是具体实现步骤。

步骤1:添加引用

首先,我们需要添加System.Management.dll的引用,该dll库提供了访问WMI的命名空间等相关内容。

选中项目,右击选择“添加”->“引用”->“浏览”,在浏览框中找到System.Management.dll并添加。

步骤2:实现判断方法

下面是实现判断方法的代码片段,需放在类中:

using System.Diagnostics;
using System.Management;

public static bool Is64BitProcess(Process process)
{
    if (Environment.Is64BitOperatingSystem)
    {
        try
        {
            var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Process WHERE ProcessId = " + process.Id);
            var queryResult = searcher.Get();

            foreach (var o in queryResult)
            {
                var item = (ManagementObject)o;
                var commandLine = (string)item["CommandLine"];
                return commandLine.Contains("System32");
            }
        }
        catch { }  // 忽略异常,返回false
    }
    return false;
}

上述代码片段中,Is64BitProcess方法接收一个Process类型的参数,用于获取指定进程的相关信息。首先,利用Environment类的方法检测当前操作系统是否为64位操作系统,若是,我们将进一步检查指定进程是否为64位进程。

具体实现过程是使用WMI的ManagementObjectSearcher类的实例,在系统中查找进程ID为process.Id的进程,根据其CommandLine属性中包含System32的信息,判断是否为64位进程。

值得注意的是,由于权限限制等原因,极少数进程无法获取CommandLine属性信息,因此如果检查错误,则返回false。

步骤3:调用判断方法

在Main函数中,我们可以调用判断方法,例如:

static void Main(string[] args)
{
    Process process = Process.GetCurrentProcess();
    bool is64Bit = Is64BitProcess(process);

    if (is64Bit)
    {
        Console.WriteLine("当前进程为64位进程");
    }
    else
    {
        Console.WriteLine("当前进程为32位进程");
    }
}

运行结果:

当前进程为64位进程

这样,我们就成功地检查了指定进程是否为64位进程或不使用环境类。完整代码请参见下面。

完整代码
using System;
using System.Diagnostics;
using System.Management;   // 添加引用

class CheckProcessBit
{
    static void Main(string[] args)
    {
        Process process = Process.GetCurrentProcess();
        bool is64Bit = Is64BitProcess(process);   // 调用判断方法

        if (is64Bit)
        {
            Console.WriteLine("当前进程为64位进程");
        }
        else
        {
            Console.WriteLine("当前进程为32位进程");
        }
    }

    // 实现判断方法
    public static bool Is64BitProcess(Process process)
    {
        if (Environment.Is64BitOperatingSystem)
        {
            try
            {
                var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Process WHERE ProcessId = " + process.Id);
                var queryResult = searcher.Get();

                foreach (var o in queryResult)
                {
                    var item = (ManagementObject)o;
                    var commandLine = (string)item["CommandLine"];
                    return commandLine.Contains("System32");
                }
            }
            catch { }   // 忽略异常,返回false
        }
        return false;
    }
}