如何在所有进程中找到确切的进程名称/地址?

时间:2013-10-03 22:15:09

标签: c# winforms

在Form1上面我做了:

Process[] hProcessSnap;
Process hProcess = null;
hProcessSnap = Process.GetProcesses();

然后在构造函数中我做了:

for (int n = 0; n < hProcessSnap.Length; n++)
            {
                if (hProcessSnap[n].ProcessName == "test")
                    hProcess = hProcessSnap[n];
            }

但是当我查看进程列表中的hProcessSnap变量时,我看到了例如: firefox mozilla浏览器的两个进程。

00001B00-FlashPlayerPlugin_11_8_800_168.exe

第二个是:

00001C5C-FlashPlayerPlugin_11_8_800_168.exe

我可以手工找到它们,但这是过程的名称吗? 我在hProcessSnap的进程列表中看到的是两个不同的地方:FlashPlayerPlugin_11_8_800_168

那么我如何找到两个进程名称中哪个是第一个,哪个是第二个?在firefox / mozilla中,第一个是00001B00-FlashPlayerPlugin_11_8_800_168.exe

但是在我的名单中我只得到了名字。 我需要找到哪个是第一个进程,哪个是第二个进程。在列表中,它们都具有相同的名称。

编辑**

这是我想如何获取/查看进程列表的示例:

http://imageshack.us/content_round.php?page=done&id=4tHcmKOjlaCtmK6S5aXJ1afO5co

编辑**

更好的形象:

http://imageshack.us/content_round.php?page=done&id=4tHcmpymlZ-pm6WSz6We4qfO5co

3 个答案:

答案 0 :(得分:1)

Name属性始终是进程的文件名减去.exe后缀。

要获取进程的实际文件名,可以执行以下操作:

string strFilename = Path.GetFileName(hProcessSnap[n].MainModule.FileName);

但是以下内容总是会返回相同的值:

string strFilename = hProcessSnap[n].Name + ".exe";

如果你想要它的确切格式(包括PID),请执行以下操作:

Process proc = hProcessSnap[n];
string strProcessListName = proc.Id.ToString("X8") +
  "-" + proc.Name + ".exe";

答案 1 :(得分:0)

我想你在问如何区分这些过程?

如果您让用户选择一个流程,那么您需要根据process.Id找到他们选择的流程。如何向用户显示此内容并在ProcessName和Id之间进行操作完全取决于应用程序的UI选择。

for (int n = 0; n < hProcessSnap.Length; n++)
{
    // ProcessName is not Unique, there could be many matching processes
    //   and this loop will only return the last one.
    if (hProcessSnap[n].ProcessName == "test")  
        hProcess = hProcessSnap[n];
    // Id is Unique - there will be only one matching process
    if (hProcessSnap[n].Id == 123)
        hProcess = hProcessSnap[n];
}

修改 抱歉,我看不到您上传的图片。任何UI的基础都是这个...你需要将列表框绑定到Process.Id,向用户显示Process.ProcessName以便他们选择一个Process,然后当你需要实际操作时(删除/ etc)您需要通过Process.Id找到它的过程。

答案 2 :(得分:0)

只需使用LINQ;

即可获得所需的结果
  Process hProcess = Process.GetProcesses().Where(x => x.ProcessName == "test").OrderBy(x => x.StartTime).FirstOrDefault();

您可能希望在Where子句中使用不同的条件,但这是基本的想法。首先过滤进程名称。然后按开始时间排序,这样你就可以弄清楚哪一个开始了。 FirstOrDefault()将返回集合中的第一个项目,如果没有项目,则返回null