C # - Получить список открытых задач - PullRequest
10 голосов
/ 22 ноября 2008

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

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

alt-tab

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

Ответы [ 4 ]

5 голосов
/ 24 ноября 2008

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

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

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

5 голосов
/ 22 ноября 2008

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

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

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

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

1 голос
/ 22 ноября 2008

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

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.

0 голосов
/ 22 ноября 2008

@ abelenky17

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

@ Дан С.

Делать что-то вроде этого:

p.ProcessName != "explorer"

кажется, хорошо? Пахнет плохо.

...