10

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

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

alt-tab

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

4

4 回答 4

5

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

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

因此,为了获得这些列表,您需要枚举窗口(这里是它的PInvoke)。

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

于 2008-11-21T22:51:07.697 回答
5

这篇文章应该会告诉你具体该怎么做,它展示了如何构建你自己的任务开关,并包含枚举所有窗口并确定它们是否是“任务”所需的代码,它展示了如何使用 PrintWindow api 来获取XP上的预览。

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

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

于 2008-11-24T19:44:32.643 回答
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。

于 2008-11-21T22:55:03.867 回答
0

@abelenky17

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

@丹·C。

做这样的事情:

p.ProcessName != "explorer"

你觉得还可以吗?真难闻。

于 2008-11-21T23:03:39.780 回答