我正在尝试找到一种在 C# 中获取打开任务的方法。我一直在谷歌上搜索,只能找到如何获取进程列表。我想要唯一会显示在任务栏上的任务。
此外,除此之外,如果我能获得与任务相关联的流程,那就太酷了。如果可能的话,获取 Vista 用于 ALT-TAB 菜单的缩略图,如下图所示:
我假设我将不得不使用 pinvokes,因为看起来确实没有任何库可以做到这一点。有任何想法吗?
这篇文章应该会告诉你具体该怎么做,它展示了如何构建你自己的任务开关,并包含枚举所有窗口并确定它们是否是“任务”所需的代码,它展示了如何使用 PrintWindow api 来获取XP上的预览。
http://msdn.microsoft.com/en-us/library/ms997649.aspx
此外,还有一篇博客文章讨论了用于确定 Alt+Tab 视图中显示内容的算法。基本上你需要检查 WS_EX_APPWINDOW 和 WS_EX_TOOLWINDOW 以及窗口是否有所有者。
我没有尝试过,但我怀疑是这样的:
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。
@abelenky17
我怀疑这不会涵盖所有情况,例如有些进程有几个顶级窗口(都出现在任务管理器中)。例如:FireFox、Windows Explorer、IE 等……这些应用程序可以在桌面上有多个窗口。此外,它不会正确处理终端会话场景(因为您枚举了系统中运行的所有进程)。
@丹·C。
做这样的事情:
p.ProcessName != "explorer"
你觉得还可以吗?真难闻。