我该如何获取当前正在运行的应用程序列表?

8
我想以编程方式获取正在运行的(桌面)应用程序列表,然后我想将此列表显示给用户。它应该类似于Windows任务管理器中显示的应用程序列表。
我该如何在C#中创建这个功能?具体来说,我需要一种方法来获取当前正在运行的应用程序列表。
1个回答

19
你可以使用 Process.GetProcesses 方法 来提供关于当前在你的电脑上运行的所有进程的信息。
但是,这些显示了所有正在运行的进程,包括那些不一定在任务栏上显示的进程。因此,您需要过滤掉那些具有空MainWindowTitle的进程。上面链接的文档解释了其中的原理:
 

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

因此,您可以使用以下代码之类的代码,它将打印出(到控制台窗口)当前所有可见的正在运行的应用程序列表:
Process[] processes = Process.GetProcesses();
foreach (var proc in processes)
{
   if (!string.IsNullOrEmpty(proc.MainWindowTitle))
        Console.WriteLine(proc.MainWindowTitle);
}

1
抱歉这是两年后的评论,但我正在寻找类似的解决方案,并想提到上面的解决方案在像WORD或ACRO-READER这样可能在桌面上打开多个文档的情况下不起作用(据我所知)。在这种情况下,似乎只有最上面的窗口被列为使用上述方法的应用程序。如果我错了,我很抱歉,但是假设我是正确的,我想知道如何列出所有窗口,即使它们来自相同的底层进程(如acrord或word)。 - Ed.
@Ed。是的,这列举了进程,但这些应用程序只运行单个进程。进程管理多个顶级窗口是无关紧要的。您可以使用EnumWindows函数枚举顶级窗口。调用此函数并指定回调函数的指针。回调函数将为屏幕上的每个顶级窗口调用一次。 - Cody Gray
如果我们有两个显示器,如何知道该进程正在哪个显示器上运行? - Alok Rajasukumaran
2
进程没有监视器亲和力,@Alok。有些处理器根本不显示任何用户界面,因此不会出现在监视器上。其他进程可能会显示多个窗口,并且这些窗口可能会出现在几个不同的监视器上。您需要选择一个窗口,然后查看该窗口所在的监视器。在Win32中,您可以使用MonitorFromWindow函数,传递一个窗口句柄(HWND)并获取一个监视器句柄(HMONITOR)。您可以在.NET中调用该函数,或者直接从WinForms使用System.Windows.Forms.Screen.FromPoint - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接