2012-02-10 4 views

risposta

2

Restituiscono valori completamente diversi, quindi non sono intercambiabili. Si può dire solo guardando le loro firme di funzione nella documentazione:

GetDesktopWindow restituisce un HWND, che è un handle a una finestra:

HWND WINAPI GetDesktopWindow(void); 

mentre OpenInputDesktop restituisce un HDESK, che è un handle a un desktop:

HDESK WINAPI OpenInputDesktop(
    __in DWORD dwFlags, 
    __in BOOL fInherit, 
    __in ACCESS_MASK dwDesiredAccess 
); 

Pertanto, quale si utilizza dipenderà ovviamente dal tipo di valore desiderato. Tutti i Desktop functions richiedono parametri di tipo HDESK. Tutte le funzioni di manipolazione delle finestre richiederanno maniglie a una finestra (HWND).

Detto questo, sarei negligente se non ti avessi avvisato di non abusare della finestra del desktop, come restituito dalla funzione GetDesktopWindow. The desktop window is very special.

16

Per quanto riguarda quello che fanno:

GetDesktopWindow() restituisce il 'root' HWND di qualsiasi desktop thread chiamante è attualmente associato; è forse meglio pensato come "Get root HWND". Tutte le altre finestre/HWND s sul desktop sono in qualche modo discendenti di questo. Le finestre di livello superiore sono bambini diretti. (Le finestre di solo messaggio sono un caso speciale, non si visualizzano nell'albero HWND, ma appartengono ancora a un desktop.) Si noti che questo non è lo stesso della finestra che è sullo sfondo con tutti i file e le icone su di esso, forse è propriamente detta la finestra "Shell Desktop", e puoi ottenerla usando GetShellWindow() - sembra essere un tipo speciale di finestra di primo livello.

OpenInputDesktop() restituisce il HDESK di qualsiasi desktop attualmente attivo e che riceve l'input dell'utente. Ogni desktop ha il proprio albero di HWND s rootato nella finestra principale o finestra 'desktop'.

Per quanto riguarda il modo in cui sono correlati, una volta che hai un HDESK, puoi usare SetThreadDesktop per impostare quel desktop come desktop predefinito del thread; quindi chiamando GetDesktopWindow restituirà l'HWND di root per quel desktop. (Si noti che è necessario disporre dell'autorizzazione per utilizzare tale HDESK in primo luogo, che in genere non è il caso se il desktop di input è il desktop bloccato, ad esempio.) È inoltre possibile utilizzare GetThreadDesktop() per ottenere il HDESK per il thread corrente.

Si potrebbe utilizzare GetDesktopWindow() se si voleva attraversare l'albero HWND per il desktop che l'applicazione è in - Spy ++ - Tipo di applicazioni potrebbero utilizzare questo per ottenere la finestra principale e da lì attraversare usando GetWindow() o simili, forse. Ma la maggior parte delle app è felice di tenersi in proprio, quindi non è necessario essere consapevoli di quali altre finestre sono disponibili. Forse un uso comune è quello di verificare se una finestra arbitraria è di primo livello: utilizzare GetAncestor(hwnd, GA_PARENT) e verificare se il valore restituito corrisponde a GetDesktopWindow().

OpenInputDesktop() è forse ancora più usato; la maggior parte delle app si trova sul desktop su cui sono state avviate e rimane lì.Forse se hai scritto un'utility di commutazione desktop che creava più desktop che l'utente poteva passare, allora quell'app o qualche altra app poteva usarla per assicurarti che fosse su quella corrente prima di visualizzare l'interfaccia utente lì, ma questo non è uno scenario comune affatto. Potrebbe essere stato possibile in una fase scrivere qualcosa come una lente d'ingrandimento o uno screen reader o un'altra app con interfaccia utente che vorrebbe "seguire l'utente" mentre cambia desktop, ma ciò non funziona con il desktop bloccato che è sicuro - quindi questi tipi di app devono utilizzare un altro modo per lavorare con quel caso.

+0

Esattamente i dettagli quello che stavo cercando. Mi interessava sapere come sono collegati tra loro. Grazie amico! – Quest

Problemi correlati