C# 我如何找到确切的进程名称/地址,而不是运行在所有进程上?

C# 我如何找到确切的进程名称/地址,而不是运行在所有进程上?,c#,winforms,C#,Winforms,在Form1 top中,我做到了: Process[] hProcessSnap; Process hProcess = null; hProcessSnap = Process.GetProcesses(); 然后在构造函数中,我做了: for (int n = 0; n < hProcessSnap.Length; n++) { if (hProcessSnap[n].ProcessName == "test")

在Form1 top中,我做到了:

Process[] hProcessSnap;
Process hProcess = null;
hProcessSnap = Process.GetProcesses();
然后在构造函数中,我做了:

for (int n = 0; n < hProcessSnap.Length; n++)
            {
                if (hProcessSnap[n].ProcessName == "test")
                    hProcess = hProcessSnap[n];
            }
for(int n=0;n
但是,当我查看进程列表时,我会看到hProcessSnap变量,例如: firefox mozilla浏览器的两个进程

00001B00-FlashPlayerPlugin_11_8_800_168.exe

第二个是:

00001C5C-FlashPlayerPlugin_11_8_800_168.exe

我可以手动找到它们,但这是过程的名称吗? 我在HPProcessSnap的进程列表中看到的是两个不同的位置:FlashPlayerPlugin_11_8_800_168

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

但在我的名单上我只知道名字。 我需要找出哪一个是第一个过程,哪一个是第二个过程。在列表中,他们都有相同的名字

编辑**

这是我希望如何获取/查看流程列表的示例:

编辑**

更好的形象:


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

如果允许用户选择进程,则需要根据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];
}
for(int n=0;n
编辑:
很抱歉,我无法看到您上载的图像。任何用户界面的基础都是。。。您需要将列表框绑定到Process.Id,向用户显示Process.ProcessName以供他们选择一个进程,然后当您需要实际操作(删除/etc)进程时,您需要按Process.Id查找它。

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";

只需使用LINQ,您就可以实现所需的结果

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

您可能希望在
Where
子句中使用不同的条件,但这是基本思想。进程名称上的第一个筛选器。然后按开始时间排序,这样你就可以知道哪一个是先开始的
FirstOrDefault()
将返回集合中的第一项,如果没有项,则返回
null

Ondrej我猜列表中出现的第一项。问题是,在列表中,我得到了两个完全相同的名字,开头没有地址,比如:00001C5C-FlashPlayerPlugin_11_8_800_168.exe。我得到的是:FlashPlayerPlugin_11_8_800_168两次。你是在问如何区分这两个进程吗?他们会有不同的Id将我的问题添加到我希望如何查看/获取进程列表的图像链接。然后根据进程附近的地址选择该进程。Angelo此行:string strFilename=Path.GetFileName(hprocessnap[n].MainModule.FileName);给我一个例外:32位进程无法访问64位进程的模块是的,您还必须在第一个代码段中处理这个问题。如果您只想访问文件名而不依赖于多个计算机基础结构,那么只需将
.exe
附加到
Name
属性的末尾,也可以使用。编辑了我的问题,添加了指向我希望如何查看/获取进程列表的图像的链接。然后根据旁边的地址选择流程。我编辑了我的答案。这就是你要找的吗?编辑了我的问题,添加了链接到我希望如何查看/获取进程列表的图像。然后根据它附近的地址选择进程。@DoronMuzar我真的看不到那张图片,但我真的不知道你要用它去哪里。。您试图以编程方式选择流程,对吗?如果将要查找的进程名称放入
中(x=>x.ProcessName==“我要查找的进程”)
中,则这将选择具有该名称的最近启动的进程。编辑了我的问题,添加了指向我希望如何查看/获取进程列表的图像的链接。然后根据进程附近的地址选择进程。