【问题标题】:Getting a list of current APPLICATIONS running, not processes c#获取当前正在运行的应用程序的列表,而不是进程 c#
【发布时间】:2018-03-09 21:26:56
【问题描述】:

我知道您可以使用Process[] processes = Process.GetProcesses();Process[] processes = Process.GetProcessesByName("processName"); 获取当前正在运行的进程的列表

但是我需要获取当前正在运行的应用程序,不一定是特定的进程。原因是有时在后台运行的进程与某个应用程序相关,但实际应用程序本身并未运行。但出于我的目的,我需要知道实际应用程序本身是否正在运行。

有没有办法在 C# 中做到这一点?

编辑:显然我还没有说清楚。例如,在任务管理器中,您可以看到当前正在运行的应用程序列表,以及当前正在运行的进程列表。我正在尝试获取可以在任务管理器中看到的应用程序列表,而不是广泛的进程列表

【问题讨论】:

  • 如果应用程序不是进程,您如何定义它?请阅读How to Ask
  • 编辑希望能澄清我的意思
  • 任何特定的 Windows 版本?至少在 Windows 10 中,列表并不总是正确的。例如,现在 Chrome 显然是一个应用程序(大部分时间它显示为应用程序)时,它是一个“后台进程”。我不认为 MS 会公布他们如何确定这一点
  • 有趣的是它是如何特定于 Windows 版本的——这实际上有助于我稍微调试一下我的问题,谢谢。我目前正在尝试从 Windows 7 中抓取。在 Windows 10 上,抓取过程正常,但在 Windows 7 上,对于我的具体情况,我需要抓取“应用程序”

标签: c# process


【解决方案1】:

获取进程列表,然后按具有MainWindowHandle 的进程进行过滤。

只有当进程具有图形界面时,该进程才具有与之关联的主窗口。如果关联进程没有主窗口,则 MainWindowHandle 值为零。对于已隐藏的进程,即在任务栏中不可见的进程,该值也为零。这可能是在任务栏最右侧的通知区域中显示为图标的进程。

如果它有一个主窗口,就任务管理器而言,它是一个“应用程序”。

var processes = Process.GetProcesses()
    .Where(p=> p.MainWindowHandle != 0)
    .ToArray();

【讨论】:

    【解决方案2】:

    艾米的答案是那个,但我不得不把它改成

    var running_apps = Process.GetProcesses()
                              .Where(p => (long)p.MainWindowHandle != 0)
                              .ToArray();
    

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多