2011-09-01 9 views
15

In VC++, utilizzo EnumWindows (...), GetWindow (...) e GetWindowLong(), per ottenere l'elenco di finestre e controllare se la finestra è in primo piano (nessun'altra finestra come proprietario) e se la finestra è visibile (WS_VISIBLE). Tuttavia, anche se il mio desktop mostra solo 5 finestre, questo EnumWindows mi dà 50 finestre, che divertimento! Qualsiasi geek di Windows qui, per favore aiutami a chiarire ...Perché EnumWindows restituisce più finestre di quanto mi aspettassi?

+1

ho visto anche una finestra c allacciato "start button" – jondinham

+7

Questo perché il pulsante di avvio è una finestra. –

risposta

27

Il modo per elencare solo le finestre sulla barra delle applicazioni (o simile in scatola Alt-Tab) è descritto da Raymond in questo articolo su MSDN blog:
http://blogs.msdn.com/b/oldnewthing/archive/2007/10/08/5351207.aspx

E questa è la funzione super per controllare se un la finestra è mostrata in alt-tab:

BOOL IsAltTabWindow(HWND hwnd) 
{ 
    TITLEBARINFO ti; 
    HWND hwndTry, hwndWalk = NULL; 

    if(!IsWindowVisible(hwnd)) 
     return FALSE; 

    hwndTry = GetAncestor(hwnd, GA_ROOTOWNER); 
    while(hwndTry != hwndWalk) 
    { 
     hwndWalk = hwndTry; 
     hwndTry = GetLastActivePopup(hwndWalk); 
     if(IsWindowVisible(hwndTry)) 
      break; 
    } 
    if(hwndWalk != hwnd) 
     return FALSE; 

    // the following removes some task tray programs and "Program Manager" 
    ti.cbSize = sizeof(ti); 
    GetTitleBarInfo(hwnd, &ti); 
    if(ti.rgstate[0] & STATE_SYSTEM_INVISIBLE) 
     return FALSE; 

    // Tool windows should not be displayed either, these do not appear in the 
    // task bar. 
    if(GetWindowLong(hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) 
     return FALSE; 

    return TRUE; 
} 

Accreditato al codice sorgente qui:
http://www.dfcd.net/projects/switcher/switcher.c

+1

Qualcuno sa perché questa funzione non sembra considerare i casi di stile esteso di WS_EX_TOOLWINDOW e di WS_EX_APPWINDOW menzionati da Raymond nel suo post sul blog? 'STATE_SYSTEM_INVISIBLE' lo copre o questa funzione non corrisponde esattamente a quella descritta da Raymond? –

+0

@adamsmith toolwindow non è la finestra in alto, non verrà mostrato nella barra delle applicazioni o nel menu alt-tab. perché la finestra padre di toolwindow non è nulla – jondinham

+5

Un ulteriore miglioramento è quello di rimuovere le finestre degli strumenti dall'elenco, che non dovrebbe essere mostrato. Come @DavidHeffernan menzionato nell'altra risposta, questo è documentato [nel seguente articolo di MSDN] (http: //http//msdn.microsoft.com/en-us/library/aa969325.aspx).Ho migliorato il codice sopra con il controllo: 'if (GetWindowLong (hwnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW) return FALSE;' –

3

Le finestre di cui stai parlando, con un pulsante X e una barra del titolo, ecc. Non sono l'unico tipo di finestre. Pulsanti, menu a discesa, etichette, icone, caselle di testo, la barra delle applicazioni e quasi tutto il resto è una finestra . Quindi, EnumWindows sta facendo esattamente quello che dovrebbe fare: enumerare tutte le finestre di primo livello.

Anche se questo è vero, EnumWindows enumera solo le finestre di livello superiore. Ciò significa it won't enumerate any child windows:

La funzione EnumWindows non enumera finestre figlio, con l'eccezione di un paio di finestre di primo livello di proprietà del sistema che ha lo stile WS_CHILD.

Tuttavia, molte cose sul desktop sono anche finestre, non solo le "finestre" a cui stai pensando.

+0

quindi qualche idea per sbarazzarsi di finestre "cosiddette" non correlate? Voglio solo un elenco di finestre visibili (finestre dell'applicazione, non finestre di dialogo, non pulsanti, ecc.) – jondinham

+2

Probabilmente vuoi solo le [finestre che appaiono nella barra delle applicazioni] (http: // http: //msdn.microsoft.com/en -us/library/aa969325.aspx). "Shell crea un pulsante sulla barra delle applicazioni ogni volta che un'applicazione crea una finestra che non è di proprietà Per garantire che il pulsante della finestra sia posizionato sulla barra delle applicazioni, creare una finestra sconosciuta con lo stile esteso WS_EX_APPWINDOW. posto sulla barra delle applicazioni, crea la finestra sconosciuta con lo stile esteso WS_EX_TOOLWINDOW In alternativa, puoi creare una finestra nascosta e rendere questa finestra nascosta il proprietario della tua finestra visibile. " –

+0

sì, voglio la lista delle finestre che appaiono nella barra delle applicazioni. so come nascondere, mostrare una finestra in modalità diversa; ma non so come ottenere questa lista – jondinham

Problemi correlati