C#-获取打开的任务列表

C#-获取打开的任务列表,c#,.net,taskbar,task,C#,.net,Taskbar,Task,我正在试图找到一种方法来获取C#中的开放任务。我一直在谷歌上搜索,只能找到如何获得进程列表。我只希望任务显示在任务栏上 此外,如果我能得到与任务相关联的流程,那就太酷了。如果可能,获取Vista用于ALT-TAB菜单的缩略图,如下图所示: 我假设我将不得不使用pinvokes,因为它看起来真的没有任何库可以做到这一点。有什么想法吗?从API(Win32)的角度来看,没有任务(至少不是Windows任务管理器/Alt选项卡显示的任务) 这些“任务”实际上是顶级窗口 因此,为了获得这些信息的列表,

我正在试图找到一种方法来获取C#中的开放任务。我一直在谷歌上搜索,只能找到如何获得进程列表。我只希望任务显示在任务栏上

此外,如果我能得到与任务相关联的流程,那就太酷了。如果可能,获取Vista用于ALT-TAB菜单的缩略图,如下图所示:

我假设我将不得不使用pinvokes,因为它看起来真的没有任何库可以做到这一点。有什么想法吗?

从API(Win32)的角度来看,没有任务(至少不是Windows任务管理器/Alt选项卡显示的任务)

这些“任务”实际上是顶级窗口

因此,为了获得这些信息的列表,您需要(这里是它的详细信息)


然后查看窗口的样式,以确定它们是否实际上是顶级窗口。

我还没有尝试过,但我怀疑是这样的:

using System.Diagnostics;
static void MyFunc()
{
    Process[] processes = Process.GetProcesses();
    foreach(Process p in processes)
    {
       if (p.MainWindowHandle != 0)
       { // This is a GUI process
       }
       else
       { // this is a non-GUI / invisible process
       }
    }
}
p.ProcessName != "explorer"
关键是要检查每个进程的WindowHandle。

@abelenky17

我怀疑这并不能涵盖所有情况,例如,有些进程有几个顶级窗口(都出现在任务管理器中)。 例如,考虑Firefox、Windows资源管理器、IE等。这些应用程序可以在桌面上有多个窗口。 此外,它不会正确处理终端会话场景(因为您枚举了系统中运行的所有进程)

@丹C

这样做:

using System.Diagnostics;
static void MyFunc()
{
    Process[] processes = Process.GetProcesses();
    foreach(Process p in processes)
    {
       if (p.MainWindowHandle != 0)
       { // This is a GUI process
       }
       else
       { // this is a non-GUI / invisible process
       }
    }
}
p.ProcessName != "explorer"

你觉得还好吗?闻起来很难闻。

这篇文章应该告诉你该做什么,它展示了如何构建自己的任务开关,包括枚举所有窗口并确定它们是否为“任务”所需的代码,还展示了如何使用PrintWindow api在XP上获得预览


此外,这里还讨论了用于确定Alt+Tab视图中显示内容的算法。基本上,您需要检查WS_EX_APPWINDOW和WS_EX_TOOLWINDOW,以及该窗口是否有所有者。

闻起来,我想看看其他选项:)同意。回答问题的目的不是为了涵盖所有情况,也不是为了编写“玫瑰色”的代码,而是为了回答问题:即提供足够的缺失信息,以便原始提问者能够清除细节。正确。回到问题上来,我已经检查过了,关于firefox没有为新实例生成新流程的说法你是对的。因此,如果需要同一应用程序的每个单独窗口,那么唯一的选项就是枚举窗口。通过枚举窗口,我可以恢复最小化的窗口吗?“if(p.MainWindowHandle!=0)”错误,但“if(p.MainWindowTitle!=””有效,即使这有点麻烦。