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

时间:2008-11-21 22:43:32

标签: c# .net taskbar task

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

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

alt-tab

我认为我将不得不使用pinvokes,因为它看起来真的不像有任何库已经这样做了。有什么想法吗?

4 个答案:

答案 0 :(得分:5)

从API(Win32)的角度来看,没有任务(至少不是Windows任务管理器/ Alt-Tab显示的那个)。

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

因此,为了获得这些列表,您需要enumerate the windows(这里是PInvoke)。

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

答案 1 :(得分:5)

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

http://msdn.microsoft.com/en-us/library/ms997649.aspx

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

答案 2 :(得分:1)

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

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
       }
    }
}

重点是检查WindowHandle的每个进程。

答案 3 :(得分:0)

@ abelenky17

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

@Dan C。

做这样的事情:

p.ProcessName != "explorer"

对你好吗?闻起来很糟糕。