Вопрос

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

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

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"

тебе кажется, что все в порядке?Это дурно пахнет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top