如何区分具有相同名称的多个进程由完全不同的Windows窗体应用程序运行?

时间:2016-02-08 19:09:33

标签: c# .net visual-studio process

我有两个具有不同功能的应用程序。 其中一个是现有的应用程序,另一个是我有目的地使用相同的名称。

当用户启动它们时,两者的进程名称相同。

使用c#,VS 2010,.Net 2.0 当我使用c#获取进程列表时,我想区分这两者和它们。

目标操作系统:XP / Win 7 / Win 8 / Win 10

3 个答案:

答案 0 :(得分:0)

使用他们的流程ID。

private static void Main(string[] args)
{
    var procs = Process.GetProcesses();
    foreach ( var proc in procs )
    {
        Console.WriteLine(proc.Id);
    }
}

答案 1 :(得分:0)

您可以使用每个流程的MainModule属性来区分版本信息:https://msdn.microsoft.com/en-us/library/system.diagnostics.process.mainmodule%28v=vs.110%29.aspx

答案 2 :(得分:0)

如果您可以找到过程文件位置,则可以确定它是哪个过程。这是一个打印出每个进程路径的小型控制台应用程序。只需更改" MyProcessName"到你的进程名称。您必须添加对System.Management的引用,并包括System.Diagnostics和System.Management。

我发现MainModule属性不能很好地工作,因为只有32位可以读取32位程序,反之亦然64位程序

class Program
{
    static void Main(string[] args)
    {
        var Processes = Process.GetProcesses();
        foreach(var proc in Processes)
        {
            if(proc.ProcessName=="MyProcessName")
            Console.WriteLine(ProcessExecutablePath(proc));
        }
        Console.ReadKey();
    }
    static private string ProcessExecutablePath(Process process)
    {
        try
        {
            return process.MainModule.FileName;
        }
        catch
        {
            string query = "SELECT ExecutablePath, ProcessID FROM Win32_Process";
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);

            foreach (ManagementObject item in searcher.Get())
            {
                object id = item["ProcessID"];
                object path = item["ExecutablePath"];

                if (path != null && id.ToString() == process.Id.ToString())
                {
                    return path.ToString();
                }
            }
        }

        return "";
    }
}