С# - Получить список открытых задач

Я пытаюсь найти способ открыть открытые задачи в С#. Я искал в google и могу узнать, как получить список процессов. Я хочу только задачи, которые будут отображаться на панели задач.

Кроме того, было бы здорово, если бы я смог получить процесс, с которым связана задача. И если возможно получить миниатюрные изображения, которые Vista использует для меню ALT-TAB, как на этом изображении:

alt-tab

Я предполагаю, что мне придется использовать pinvokes, потому что на самом деле не похоже, что для этого уже есть библиотеки. Любые идеи?

Ответ 1

Эта статья должна в значительной степени сказать вам, что именно делать, она показывает, как создать собственный переключатель задач и включает код, необходимый для перечисления всех окон и определения, являются ли они "задачами", и показывает, как использовать PrintWindow api для получения предварительного просмотра на XP.

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

Кроме того, здесь сообщение в блоге, в котором говорится об алгоритме, используемом для определения того, что отображается в представлении Alt + Tab. В основном вам нужно проверить WS_EX_APPWINDOW и WS_EX_TOOLWINDOW вместе с тем, если у окна есть владелец.

Ответ 2

С точки зрения API (Win32) нет такой задачи, как "Задачи" (по крайней мере, не та, которую показывает диспетчер задач Windows/Alt-Tab).

Эти "Задачи" на самом деле являются окнами верхнего уровня.

Итак, чтобы получить список тех, вам нужно перечислить окна (здесь PInvoke для него).

Затем посмотрите на стиль окон, чтобы определить, действительно ли они являются окнами верхнего уровня.

Ответ 3

Я не пробовал, но подозреваю что-то вроде этого:

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.

Ответ 4

@abelenky17

Я подозреваю, что это не будет охватывать все случаи, например, есть процессы, у которых есть несколько окон верхнего уровня (все они отображаются в диспетчере задач). Рассмотрим, например: FireFox, Windows Explorer, IE и т.д.... эти приложения могут иметь несколько окон на рабочем столе. Кроме того, он не будет корректно обрабатывать сценарий сеансов терминалов (поскольку вы перечисляете все процессы, запущенные в системе).

@Dan C.

Выполнение чего-то подобного:

p.ProcessName != "explorer"

Кажется хорошо для вас? Он пахнет, плохо.