Domanda

Sto cercando di trovare un modo per ottenere le attività aperte in C #. Ho cercato su Google e riesco a trovare solo come ottenere un elenco dei processi . Voglio le uniche attività che verrebbero visualizzate sulla barra delle applicazioni.

Inoltre, insieme a quello, sarebbe bello se potessi ottenere il processo a cui è associata l'attività. E se possibile ottieni le miniature che Vista utilizza per il menu ALT-TAB, come in questa immagine:

 alt-tab

Suppongo che dovrò usare il pinvoke perché in realtà non sembra che ci siano già delle librerie per farlo. Qualche idea?

È stato utile?

Soluzione

Questo articolo dovrebbe dirti esattamente cosa fare, mostra come costruire il tuo switch di attività e include il codice necessario per enumerare tutte le finestre e determinare se sono "task". e ti mostra come usare PrintWindow api per ottenere le anteprime su XP.

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

Inoltre, ecco un post sul blog che parla dell'algoritmo utilizzato per determinare ciò che appare nella vista Alt + Tab. Fondamentalmente è necessario controllare WS_EX_APPWINDOW e WS_EX_TOOLWINDOW insieme a se la finestra ha un proprietario.

Altri suggerimenti

Dal punto di vista dell'API (Win32) non esiste qualcosa come Attività (almeno non quella mostrata da Task Manager di Windows / Alt-Tab).

Quelle " Compiti " sono in realtà finestre di livello superiore.

Quindi, per ottenere un elenco di questi, è necessario enumera le finestre (ecco il PInvoke per esso).

Quindi guarda lo stile delle finestre per determinare se sono effettivamente finestre di livello superiore.

Non l'ho provato, ma sospetto qualcosa del genere:

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

Il punto è controllare ogni processo per un WindowHandle.

@ abelenky17

Sospetto che questo non riguarderà tutti i casi, ad esempio ci sono processi che hanno diverse finestre di livello superiore (che compaiono tutte nel task manager). Consideriamo ad esempio: FireFox, Windows Explorer, IE, ecc ... quelle applicazioni possono avere più finestre sul desktop. Inoltre, non gestirà correttamente lo scenario delle sessioni terminal (poiché vengono enumerati tutti i processi in esecuzione nel sistema).

@Dan C.

Fare qualcosa del genere:

p.ProcessName != "explorer"

ti sembra ok? Odora, male.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top