【问题标题】:How to get process "type" (App, Background Process, or Windows Process)如何获取进程“类型”(应用程序、后台进程或 Windows 进程)
【发布时间】:2014-11-23 08:01:05
【问题描述】:

我正在尝试获取“应用程序”类型的所有进程的列表(而不是“后台进程”或“Windows 进程”)。

很遗憾,虽然我知道...

var processList = Process.GetProcesses();

会给我一个系统上运行的所有进程的列表,我不知道如何获取进程的“类型”。 'Process' 确实有一个方法 'GetType',但它似乎并没有指代我所指的“类型”,而 TaskManager 在上图中指的是。

有谁知道我如何将任务管理器称为“类型”的这个值放入给定进程的变量中?

注意:C#。

【问题讨论】:

  • 我不确定 Windows 8 任务管理器用于对进程进行分类的逻辑。你可能不得不问雷蒙德陈。 :) 但我怀疑它正在查看进程是否至少有一个 UI 窗口。您不会从 Process 类中获得这些信息,但您可以关联有关存在的窗口和拥有它们的进程的信息。
  • 也许该类型与进程有关'MainWindowHandle 属性;不确定Refresh method 的正确使用。在任何情况下:只有当进程具有图形界面时,进程才具有与其关联的主窗口,否则MainWindowHandle 的值为零。

标签: c# windows types process diagnostics


【解决方案1】:

我找不到确切的答案,但我找到了对我有帮助的东西。您需要使用 Process 类的 MainWindowHandle 属性。

var processes = Process.GetProcesses().Where(pr => pr.MainWindowHandle != IntPtr.Zero);

foreach (Process proc in processes)
    Console.WriteLine(proc.ProcessName);

警告

如果您尝试获取 proc.MainModule.FileName,您可能会看到 Win32Exception 异常。为了避免这个问题,我将我的项目编译为 x64(你的项目 -> 属性 -> 构建 -> 平台目标 -> x64)。

【讨论】:

    【解决方案2】:

    遇到同样的问题,在以下链接中找到答案:https://devblogs.microsoft.com/oldnewthing/20171219-00/?p=97606

    • 如果进程有可见窗口,则任务管理器将其称为“应用程序”。
    • 如果进程是marked as critical,则任务管理器将其称为“Windows 进程”。
    • 否则,任务管理器将其称为“后台进程”。

    【讨论】:

      猜你喜欢
      • 2010-12-26
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多