10 Stimmen

C# - Liste der offenen Aufgaben abrufen

Ich versuche, eine Möglichkeit zu finden, die offenen Aufgaben in C# zu erhalten. Ich habe auf Google gesucht und kann nur finden, wie man eine Liste der Prozesse . Ich möchte, dass nur die Aufgaben, die auf der Taskleiste angezeigt würde.

Außerdem wäre es gut, wenn ich den Prozess, dem die Aufgabe zugeordnet ist, abrufen könnte. Und wenn möglich, erhalten Sie die Miniaturbilder, die Vista für das ALT-TAB-Menü verwendet, wie in diesem Bild:

alt-tab

Ich nehme an, dass ich pinvokes verwenden muss, da es nicht so aussieht, als gäbe es bereits Bibliotheken, die dies ermöglichen. Irgendwelche Ideen?

5voto

Asher Punkte 1857

Aus Sicht der API (Win32) gibt es keine Aufgaben (zumindest nicht die, die der Windows Task Manager/Alt-Tab anzeigt).

Diese "Aufgaben" sind in Wirklichkeit Fenster der obersten Ebene.

Um also eine Liste davon zu erhalten, müssen Sie die Fenster aufzählen (hier ist die PInvoke für sie).

Sehen Sie sich dann den Stil der Fenster an, um festzustellen, ob es sich tatsächlich um Fenster der obersten Ebene handelt.

0 Stimmen

Kann ich durch die Aufzählung von Windows wiederherstellen, dass Windows minimiert ist?

5voto

Maurice Flanagan Punkte 5081

Dieser Artikel sollte ziemlich genau sagen, was zu tun ist, es zeigt, wie Sie Ihre eigenen Task-Switch zu bauen und enthält den Code benötigt, um alle Windows aufzulisten und festzustellen, ob sie "Aufgaben" sind, und es zeigt Ihnen, wie Sie PrintWindow api verwenden, um die Vorschauen auf XP zu erhalten.

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

Außerdem ist hier einen Blogbeitrag der den Algorithmus beschreibt, mit dem bestimmt wird, was in der Alt+Tab-Ansicht angezeigt wird. Grundsätzlich müssen Sie die WS_EX_APPWINDOW und WS_EX_TOOLWINDOW prüfen und ob das Fenster einen Besitzer hat.

1voto

abelenky Punkte 60187

Ich habe es nicht ausprobiert, aber ich vermute so etwas:

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
       }
    }
}

Es geht darum, jeden Prozess auf ein WindowHandle zu überprüfen.

1 Stimmen

"If (p.MainWindowHandle != 0)" schlägt fehl, aber "If (p.MainWindowTitle != '')" funktioniert, auch wenn es ein wenig umständlich ist.

0voto

Asher Punkte 1857

@abelenky17

Ich vermute, dass dies nicht alle Fälle abdeckt, z. B. gibt es Prozesse, die mehrere Fenster der obersten Ebene haben (die alle im Task-Manager erscheinen). Betrachten Sie zum Beispiel: FireFox, Windows Explorer, IE, etc... diese Anwendungen können mehrere Fenster auf dem Desktop haben. Außerdem werden Terminal-Sessions-Szenarien nicht richtig behandelt (weil Sie alle im System laufenden Prozesse aufzählen).

@Dan C.

In etwa so:

p.ProcessName != "explorer"

Finden Sie das in Ordnung? Es riecht schlecht.

0 Stimmen

So wie es riecht, würde ich gerne die Alternativen sehen :)

0 Stimmen

Einverstanden. Der Zweck der Beantwortung einer Frage besteht nicht darin, alle Fälle abzudecken oder einen Code zu erstellen, der "rosig" riecht, sondern die Frage zu beantworten, d. h. genügend der fehlenden Informationen zu liefern, damit der ursprüngliche Fragesteller die Details herausspülen kann.

1 Stimmen

Richtig. Um auf die Frage zurückzukommen, ich habe es überprüft und Sie haben Recht, dass Firefox keinen neuen Prozess für neue Instanzen erzeugt. Wenn also jedes einzelne Fenster der gleichen Anwendung benötigt wird, dann ist die einzige Option, Windows aufzuzählen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X