0

在 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

4

3 回答 3

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";
于 2013-10-03T23:07:46.983 回答
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.Id找到它的进程。

于 2013-10-03T22:44:11.723 回答
0

只需使用 LINQ,您就可以达到预期的效果;

  Process hProcess = Process.GetProcesses().Where(x => x.ProcessName == "test").OrderBy(x => x.StartTime).FirstOrDefault();

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

于 2013-10-03T23:09:33.503 回答