GetProcessesByName不起作用

时间:2014-06-12 06:53:49

标签: c#

在搜索了很多关于这个问题之后,我仍然面临着检查运行过程是否已经完成的问题。 当用户点击GUI中的“Go”按钮时,程序运行约5秒钟并关闭。完成后,我想做一些事情(例如,GUI中的绿色标记)。

我的问题是'GetProcessesByName'显然无法看到程序,这很奇怪,因为我在任务管理器中看到它。程序名称为quartus_pgm.exe。请参阅以下代码,我已尝试quartus_pgmquartus_pgm.exequartus_pgm.exe32(如任务管理器中所示),但没有!

如果我放'cmd'它确实看到它(quartus_pgm是从cmd中提取的),但它不是我想要的。 我尝试了各种方法:

Process[] targetProcess = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(processName));

或者这个:

 Process[] processes = Process.GetProcessesByName("quartus_pgm");
                      if (processes.Length > 0)
                        // do something;

或者这个:

foreach (var process in Process.GetProcessesByName("quartus_pgm.exe"))
                {
                    // do something;
                }

3 个答案:

答案 0 :(得分:23)

尝试删除.exe部分。

foreach (var process in Process.GetProcessesByName("quartus_pgm"))
{
         // do something;
}

来自here

  

进程名称是进程的友好名称,例如Outlook,   不包括.exe扩展名或路径

<强>更新

尝试列出计算机中的所有流程,查找quartus_pgm流程名称。

 foreach (var process in Process.GetProcesses())
 {
     Console.WriteLine(process.ProcessName);
 }

答案 1 :(得分:1)

此方法是否有区分大小写的可能性?如果你循环完成这些过程,你会找到它吗?

foreach (Process p in Process.GetProcesses())
            {
                if (p.ProcessName.ToLower() == "quartus_pgm")
                {

                }
            }

答案 2 :(得分:1)

由于您自己已经开始了这个过程,为什么不保留Process引用呢?那你就可以做到

if (process.HasExited) { ... }

(不要忘记你必须致电process.Refresh以确保HasExited财产得到正确更新。

或者甚至只是等待它的等待句柄(理想情况下使用异步代码)。