C # - Получить список открытых задач
Вопрос
Я пытаюсь найти способ получить открытые задачи на C #.Я искал в Google и могу найти только то, как получить список процессы.Мне нужны только те задачи, которые отображались бы на панели задач.
Кроме того, наряду с этим, было бы здорово, если бы я мог получить процесс, с которым связана задача.И, если возможно, получите уменьшенные изображения, которые Vista использует для меню ALT-TAB, как на этом изображении:
Я предполагаю, что мне придется использовать pinvokes, потому что на самом деле не похоже, что для этого уже существуют какие-либо библиотеки.Есть какие-нибудь идеи?
Решение
В этой статье должно быть подробно рассказано, что делать, в ней показано, как создать собственный переключатель задач, и содержится код, необходимый для перечисления всех окон и определения того, являются ли они «заданиями». и он показывает вам, как использовать PrintWindow API для предварительного просмотра в XP.
http://msdn.microsoft.com/en-us/library /ms997649.aspx р>
Кроме того, вот сообщение в блоге это говорит об алгоритме, используемом для определения того, что отображается в представлении Alt + Tab. В основном вам нужно проверить WS_EX_APPWINDOW и WS_EX_TOOLWINDOW, а также, есть ли у окна владелец.
Другие советы
С точки зрения API (Win32) нет такой вещи, как Задачи (по крайней мере, та, которую показывает Диспетчер задач Windows / Alt-Tab).
Эти " Задачи " на самом деле окна верхнего уровня. Р>
Итак, чтобы получить их список, вам нужно перечислить окна (здесь PInvoke для Это). Р>
Затем посмотрите на стиль окон, чтобы определить, действительно ли они являются окнами верхнего уровня.
Я не пробовал, но подозреваю, что-то вроде этого:
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, IE и т.д...эти приложения могут иметь несколько окон на рабочем столе.Кроме того, он не будет корректно обрабатывать сценарий терминальных сеансов (потому что вы перечисляете все процессы, запущенные в системе).
@Дэн Си .
Делать что-то вроде этого:
p.ProcessName != "explorer"
тебе кажется, что все в порядке?Это дурно пахнет.