Qual è la differenza di utilizzo tra le API GetDesktopWindow
e OpenInputDesktop
in Windows?Qual è la differenza tra le API GetDesktopWindow e OpenInputDesktop in Windows?
risposta
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.
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.
- 1. Qual è la differenza tra socket e HANDLE in Windows?
- 2. Qual è la differenza tra _chdir e SetCurrentDirectory in windows?
- 3. Qual è la differenza tra un'App API e un'app Web?
- 4. Qual è la differenza tra API e servizi Web?
- 5. Qual è la differenza tra GTK # e Windows Form?
- 6. Qual è la differenza tra .ToString() e + ""
- 7. Qual è la differenza tra dict() e {}?
- 8. Qual è la differenza tra l'aspettativa e quando in $ httpBackend
- 9. Qual è la differenza tra Monad.Reader e le (->) monadi?
- 10. Qual è la differenza tra le funzioni VarIsEmpty e VarIsEmptyParam
- 11. Qual è la differenza tra le annotazioni @CascadeOnDelete e CascadeType.REMOVE?
- 12. Qual è la differenza tra ::: e ++ per le liste?
- 13. Qual è la differenza tra = e: =
- 14. Qual è la differenza tra `##` e `hashCode`?
- 15. qual è la differenza tra:.! e: r !?
- 16. Qual è la differenza tra Verilog! e ~?
- 17. Qual è la differenza tra ("") e (null)
- 18. qual è la differenza tra le attività AntCall e Ant?
- 19. Qual è la differenza tra un Hashtable e le Proprietà?
- 20. Qual è la differenza tra? : e ||
- 21. qual è la differenza tra [[], []] e [[]] * 2
- 22. Qual è la differenza tra $ e $$?
- 23. Qual è la differenza tra " " e ""?
- 24. Qual è la differenza tra {0} e ""?
- 25. Qual è la differenza tra {0} e +?
- 26. Qual è la differenza tra strtok_r e strtok_s in C?
- 27. Qual è la differenza tra '() e (lista) in Clojure?
- 28. Qual è la differenza tra il progetto api classico e unified api ios in xamarin
- 29. Qual è la differenza tra metodi e statica in Mongoose?
- 30. Qual è la differenza tra @Entity in Hibernate e JPA
Esattamente i dettagli quello che stavo cercando. Mi interessava sapere come sono collegati tra loro. Grazie amico! – Quest