【问题标题】:How can I obtain a list of currently running applications?如何获取当前正在运行的应用程序列表?
【发布时间】:2010-12-09 06:12:42
【问题描述】:

我想以编程方式获取正在运行的(桌面)应用程序的列表,然后我想将此列表显示给用户。它应该类似于 Windows 任务管理器中显示的应用程序列表。

如何在 C# 中创建它?具体来说,我需要一种方法来获取当前正在运行的应用程序的列表。

【问题讨论】:

    标签: c# .net windows winforms


    【解决方案1】:

    您可以使用Process.GetProcesses method 提供有关当前在您的计算机上运行的所有进程的信息。

    但是,这会显示所有正在运行的进程,包括那些不一定显示在任务栏上的进程。所以你需要做的是过滤掉那些有空MainWindowTitle的进程。上面链接的文档解释了为什么这样做:

    一个进程有一个关联的主窗口 仅当该过程具有 图形界面。如果相关联 进程没有主窗口 (因此 MainWindowHandle 为零), MainWindowTitle 是一个空字符串 ("")。

    因此,您可以使用类似于以下代码的代码,它将打印出(到控制台窗口)任务栏上可见的所有当前正在运行的应用程序的列表:

    Process[] processes = Process.GetProcesses();
    foreach (var proc in processes)
    {
       if (!string.IsNullOrEmpty(proc.MainWindowTitle))
            Console.WriteLine(proc.MainWindowTitle);
    }
    

    【讨论】:

    • 我为这个 2 年后的评论道歉,但我正在寻找类似的解决方案,并想提一下,上述解决方案在 WORD 或 ACRO 等情况下不起作用(AFAIK)-可能在桌面上打开多个文档的阅读器。在这种情况下,似乎只有最上面的窗口被列为使用上述方法的应用程序。如果我错了我道歉,但假设我是对的,我想知道如何列出所有窗口,即使它们来自同一个底层进程(如 acrord 或 word)。
    • @Ed。是的,这会枚举进程,但这些应用程序只运行一个进程。进程管理多个顶级窗口是无关紧要的。您可以使用EnumWindows function 枚举顶级窗口。调用此函数并指定一个指向回调函数的指针。屏幕上的每个顶级窗口都会调用一次回调函数。
    • 如果我们有2个显示监视器,如何知道这个进程正在运行哪个监视器?
    • 进程没有监视器关联,@Alok。一些处理器不显示任何用户界面,因此不会出现在监视器上。其他进程可能会显示多个窗口,并且这些窗口可能会出现在几个不同的监视器上。您需要选择一个窗口,然后查看该窗口在哪个监视器上。在 Win32 中,您将使用 MonitorFromWindow 函数,传入一个窗口句柄 (HWND) 并获取一个监视器句柄 (HMONITOR)。您可以在 .NET 中 P/Invoke 它,也可以直接从 WinForms 使用 System.Windows.Forms.Screen.FromPoint。
    猜你喜欢
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    相关资源
    最近更新 更多