Ich hätte gerne eine einzelne ordentliche (schließen und selbständige) Funktion (nennen wir es GetDesktopHandle), die ein Handle auf das Desktop-Fenster zurückgibt. Ich benutze den folgenden Code. Aber es funktioniert nur in der DeskHandle ist eine globale Var.Wie verwende ich die Rückruffunktion von EnumWindows?
Wie loswerden dieser globalen Variable? Wenn ich es vor Ort machen erhalte ich eine AV in getDesktopWnd wenn ich DeskHandle versuchen: = hChild
VAR DeskHandle : HWND;
function GetDesktopHandle: HWND;
function getDesktopWnd (Handle: HWND; NotUsed: Longint): bool; stdcall; { Callback function }
VAR hChild : HWND;
begin
if handle <> 0 then
begin
hChild := FindWindowEx(handle, 0, 'SHELLDLL_DefView', nil);
if hChild <> 0 then
begin
hChild := FindWindowEx(hChild, 0, 'SysListView32', nil);
if hChild <> 0
then DeskHandle := hChild;
end;
end;
Result:= TRUE;
end;
begin
DeskHandle := 0;
EnumWindows(@getDesktopWnd, 0);
Result:= DeskHandle;
end;
Die Hauptfrage ist: kann ich diesen Code als eine einzige Funktion schreiben, oder zumindest kann ich loswerden der externen/globalen var?
Mögliche Lösung:
Die Dokumentation besagt, dass der zweite Parameter nur ein IN-Parameter ist.
lParam [in] Typ: LPARAM Eine Anwendung definierten Wert an die Callback-Funktion übergeben werden.
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633497%28v=vs.85%29.aspx
wäre es falsch, es zu benutzen, das Ergebnis wieder passieren?
Anstatt alle Top-Level-Fenster auf der Suche nach der Wurzel des Desktops aufzuzählen, können Sie einfach 'GetShellWindow' aufrufen, um direkt darauf zuzugreifen. Verwenden Sie dann 'FindWindowEx' zweimal, wie Sie es bereits tun. –
Siehe auch http://StackOverflow.com/a/5691808/33732 –
Es gibt eine vorhandene Funktion zum Abrufen des Desktop-Fenster-Handle und es heißt [GetDesktopWindow] (https://msdn.microsoft.com/en-us/library /windows/desktop/ms633504(v=vs.85).aspx) – Remko