如何通过完全不同的 Windows 表单应用程序来区分具有相同名称 运行 的多个进程?
How to distinguish multiple processes with same name run by totally different Windows forms applications?
我有两个功能不同的应用程序。
其中一个是现有的应用程序,另一个是我有意制作的同名应用程序。
当它们由用户启动时,两者的进程名称相同。
使用 c#、VS 2010、.Net 2.0
我想在使用c#获取进程列表的时候区分这两者和他们
目标OS:XP/Win 7/Win 8/Win 10
使用他们的进程 ID。
private static void Main(string[] args)
{
var procs = Process.GetProcesses();
foreach ( var proc in procs )
{
Console.WriteLine(proc.Id);
}
}
您可以使用每个进程的 MainModule 属性 通过版本信息来区分它们:https://msdn.microsoft.com/en-us/library/system.diagnostics.process.mainmodule%28v=vs.110%29.aspx
如果您能找到进程文件位置,您就可以确定它是哪个进程。这是一个打印出每个进程路径的小型控制台应用程序。只需将 "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 "";
}
}
我有两个功能不同的应用程序。 其中一个是现有的应用程序,另一个是我有意制作的同名应用程序。
当它们由用户启动时,两者的进程名称相同。
使用 c#、VS 2010、.Net 2.0 我想在使用c#获取进程列表的时候区分这两者和他们
目标OS:XP/Win 7/Win 8/Win 10
使用他们的进程 ID。
private static void Main(string[] args)
{
var procs = Process.GetProcesses();
foreach ( var proc in procs )
{
Console.WriteLine(proc.Id);
}
}
您可以使用每个进程的 MainModule 属性 通过版本信息来区分它们:https://msdn.microsoft.com/en-us/library/system.diagnostics.process.mainmodule%28v=vs.110%29.aspx
如果您能找到进程文件位置,您就可以确定它是哪个进程。这是一个打印出每个进程路径的小型控制台应用程序。只需将 "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 "";
}
}