2008-11-21 9 views
10

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

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

alt-tab

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

ответ

5

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

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

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

5

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

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

Так, чтобы получить их список, вам необходимо указать enumerate the windows (здесь PInvoke).

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

+0

Перечислив окна, можно ли восстановить окна из минимума? – Joel 2008-11-24 19:31:28

1

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

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.

+1

«Если (p.MainWindowHandle! = 0)» ошибки, но «Если (p.MainWindowTitle! = '')» Работает, даже если это немного взломан. – 2009-09-07 03:30:18

0

@ abelenky17

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

@Dan C.

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

p.ProcessName != "explorer" 

кажется нормально для вас? Это плохо пахнет.

+0

Как пахнет, я бы хотел увидеть альтернативы :) – 2008-11-22 00:16:24

+0

Согласен.Цель ответа на вопрос состоит не в том, чтобы охватить все случаи, либо сделать код, который пахнет «розовым», а ответить на вопрос: то есть предоставить достаточную информацию, которую может попросить исходный вопросник. – abelenky 2008-11-22 00:20:42

Смежные вопросы