【问题标题】:Get proccess by name of displayNameFile通过 displayName 文件的名称获取进程
【发布时间】:2019-05-09 16:38:53
【问题描述】:

您好,我有一个应用程序可以显示您在电脑中安装的所有应用程序,例如:

谷歌浏览器 Mozilla Firefox 63.0.3(x64 en-GB) 等等……

我想按名称获取每个应用程序的进程。 (比如 Mozilla Firefox 63.0.3(x64 en-GB).getProcess())

感谢您的帮助。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 您想枚举所有正在运行的进程,并找出每个进程的可执行文件名吗?
  • 我想通过displayName知道app的进程是什么

标签: c# windows process system.diagnostics


【解决方案1】:

您可以从使用 WMI 和 FileVersionInfo 构建进程字典开始。

private static IList<ProcessInfo> BuildProcessDictionary()
{
  var wmiQueryString = "SELECT ProcessId, ExecutablePath FROM Win32_Process";
  using (var searcher = new ManagementObjectSearcher(wmiQueryString))
  using (var results = searcher.Get())
  {
    var processList = from p in Process.GetProcesses()
                      join mo in results.Cast<ManagementObject>()
                      on p.Id equals (int)(uint)mo["ProcessId"]
                      select new ProcessInfo
                      {
                        Process = p,
                        Path = (string)mo["ExecutablePath"],
                        DisplayName = (string)mo["ExecutablePath"]!=null?FileVersionInfo.GetVersionInfo((string)mo["ExecutablePath"]).FileDescription:string.Empty
                      };
                return processList.ToList();
   }
   return default;
 }

 public class ProcessInfo
 {
   public string Path { get; set; }
   public string DisplayName { get; set; }
   public Process Process { get; set; }
 }

然后就可以查询集合了

var processDictionary = BuildProcessDictionary();
var found = processDictionary.Where(x => x.DisplayName!=null && x.DisplayName.Equals("Google Chrome"));

更新

var listOfPrograms = new[] { "Google Chrome", "Notepad" };
var processDictionary = BuildProcessDictionary();
foreach (var item in listOfPrograms)
{
  try
  {
    var programInstances = processDictionary.Where(x => x.DisplayName != null && x.DisplayName.Equals(item));
    foreach (var programInstance in programInstances)
    {
      programInstance.Process.Kill();
    }
  }
  catch (Exception )
  {
     // Log items that wasn't found or coudn't be killed.
    Console.WriteLine($"Could not find or kill process {item}");
  }
}

【讨论】:

  • 谢谢你真的帮助了我,但我需要一些不同的东西我有一个“选择的应用程序”列表,比如 mozilla firefox,我想找到并杀死它们你能帮我吗?
  • @Dr.Memory 抱歉延迟回复,我已根据您的 cmets 更新了我的答案。程序列表将与字典中的项目进行比较,如果找到匹配项(这意味着它正在运行),它将杀死它。
  • 非常感谢,但你能解释一下为什么代码不能在这里编译吗:select new ProcessInfo { Process = p, Path = (string)mo["ExecutablePath"], DisplayName = (string)mo ["ExecutablePath"]!=null?FileVersionInfo.GetVersionInfo((string)mo["ExecutablePath"]).FileDescription:string.Empty };
  • 希望您参考 System.Diagnostics 和 System.Management ?如果没有,请添加它们
  • System.IO.FileNotFoundException: 'C:\Windows\System32\RuntimeBroker.exe'
【解决方案2】:

可以得到所有进程的数组:

using System.Diagnostics;
...
Process[] allProcesses = Process.GetProcesses();

然后对于每个进程,您可以找到有关 ProccessModule 的信息(例如文件名、模块名...),该ProccessModule 用于使用Process.MainModule 属性启动进程。

【讨论】:

  • 很抱歉,我想要特定的应用程序而不是全部过程
猜你喜欢
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-10
相关资源
最近更新 更多