Was ist der Unterschied zwischen den GetDesktopWindow- und OpenInputDesktop-APIs in Windows?

8

Was ist der Nutzungsunterschied zwischen den APIs GetDesktopWindow und OpenInputDesktop in Windows?

    
Quest 10.02.2012, 03:51
quelle

2 Antworten

16

Was sie tun:

GetDesktopWindow() gibt den 'root' HWND des Desktops zurück, mit dem der aufrufende Thread momentan verbunden ist; es ist vielleicht besser gedacht als "Get root HWND ". Alle anderen Windows / HWND s auf dem Desktop sind irgendwie Nachkommen davon. Top-Level-Fenster sind direkte Kinder. (Fenster nur für Nachrichten sind ein Sonderfall, sie erscheinen nicht in der HWND-Struktur, gehören aber immer noch zu einem Desktop.) Beachten Sie, dass dies nicht dasselbe ist wie das Fenster, das sich im Hintergrund mit allen Dateien und Symbolen befindet darauf heißt das vielleicht das "Shell Desktop" -Fenster, und Sie können das mit GetShellWindow() - es ist einfach eine spezielle Art von Top-Level-Fenster.

OpenInputDesktop() gibt die HDESK des aktuellen Desktops zurück und empfängt Benutzereingaben. Jeder Desktop hat seinen eigenen Baum von HWND s, der im Hauptfenster oder Desktop-Fenster verwurzelt ist.

Wenn Sie ein HDESK haben, können Sie SetThreadDesktop verwenden, um diesen Desktop als den Standarddesktop des Threads festzulegen; Der Aufruf von GetDesktopWindow gibt dann das Root-HWND für diesen Desktop zurück. (Beachten Sie, dass Sie die Berechtigung haben müssen, dieses HDESK zuerst zu verwenden, was normalerweise nicht der Fall ist, wenn der Eingabedesktop beispielsweise der gesperrte Desktop ist.) Sie können GetThreadDesktop() auch verwenden, um HDESK zu erhalten der aktuelle Thread.

Sie könnten GetDesktopWindow() verwenden, wenn Sie den HWND Baum für den Desktop, auf dem sich Ihre Anwendung befindet, durchlaufen möchten - Spy ++ - Apps könnten dies verwenden, um das Stammfenster zu erhalten und von dort aus mit GetWindow() oder ähnlichem zu traversieren , vielleicht. Aber die meisten Apps sind glücklich, sich selbst zu behalten, so dass sie nicht wissen müssen, welche anderen Fenster es gibt. Vielleicht ist es üblich, zu überprüfen, ob ein beliebiges Fenster auf oberster Ebene ist: Verwenden Sie GetAncestor(hwnd, GA_PARENT) und prüfen, ob der Rückgabewert mit GetDesktopWindow() übereinstimmt.

OpenInputDesktop() wird vielleicht noch seltener verwendet; Die meisten Apps sitzen einfach auf dem Desktop, auf dem sie gestartet wurden, und bleiben dort. Wenn Sie beispielsweise ein Dienstprogramm zum Desktop-Switching geschrieben haben, das mehrere Desktops erstellt, zwischen denen der Benutzer wechseln kann, kann diese App oder eine andere App sicherstellen, dass sie auf dem aktuellen Stand vor der Anzeige der Benutzeroberfläche ist. Dies ist jedoch kein häufiges Szenario überhaupt. Es könnte in einem Stadium möglich gewesen sein, etwas wie eine Lupe oder einen Bildschirmleser oder eine andere App mit UI zu schreiben, die beim Wechseln zwischen Desktops dem Benutzer "folgen" würde, aber das funktioniert nicht mit dem gesperrten Desktop, der sicher ist - also müssen diese Arten von Apps stattdessen eine andere Möglichkeit nutzen, um mit diesem Fall zu arbeiten.

    
BrendanMcK 10.02.2012 04:35
quelle
2

Sie geben völlig unterschiedliche Werte zurück, sodass sie nicht austauschbar sind. Das erkennen Sie an den Funktionssignaturen in der Dokumentation:

GetDesktopWindow gibt ein HWND zurück, das ein Handle ist zu einem Fenster:

%Vor%

während OpenInputDesktop gibt HDESK zurück, was a ist Handle auf einen Desktop:

%Vor%

Daher hängt es natürlich davon ab, welche Art von Wert Sie benötigen. Alle Desktop-Funktionen erfordern Parameter vom Typ HDESK . Alle Fenstermanipulationsfunktionen erfordern Handles für ein Fenster ( HWND ).

All das gesagt, ich wäre nachlässig, wenn ich Sie nicht vor dem Missbrauch des Desktop-Fensters warnen würde, wie es von der Funktion GetDesktopWindow zurückgegeben wird. Das Desktop-Fenster ist etwas ganz Besonderes.

    
Cody Gray 10.02.2012 03:57
quelle

Tags und Links