Hallo,
ich habe, wie ich schon in diesem
Thread beschrieben, die Desktop-Icon-speichern und -herstellen-Funktionen aus Luckies
LuckieDips übernommen.
Meine Anwendung ist eigentlich nur ein TrayIcon mit einem Popup-Menü über die man u. a. die Positionen speichern und wiederherstellen kann.
Die MainForm ist versteckt.
Nun habe ich immer mal wieder das Problem, dass ich von der Function "SetDesktopIconPos" ein false zurück bekomme. Wenn ich aber dann die Function debugge, dann funktioniert die Function problemlos.
Mit zuhilfenahme von ShowMessage bin ich nun auf die entsprechende problematische Stelle gekommen und auch auf die Situation gestoßen, bei der es funktioniert oder auch nicht funktioniert.
Den "Fehler" schmeisst diese Function:
Delphi-Quellcode:
function GetDesktopListView: HWND;
var
Progman: HWND;
DefView: HWND;
function EnumDefViewProc(Wnd: HWND; out DefView: HWND): BOOL; stdcall;
var
ClassName: array[0..255] of Char;
begin
DefView := Wnd;
ClassName[0] := #0;
GetClassName(Wnd, ClassName, 255);
Result := lstrcmp(ClassName, 'SHELLDLL_DefView') <> 0;
end;
begin
Result := 0;
Progman := FindWindow('Progman', nil);
If Progman <> 0 then
begin
DefView := FindWindowEx(Progman, HWND(nil), 'SHELLDLL_DefView', nil);
If DefView <> 0 then
begin
If IsActiveDesktopActive then
EnumChildWindows(DefView, @EnumDefViewProc, LPARAM(@DefView));
Result := FindWindowEx(DefView, 0, 'SysListView32', nil);
end;
end;
end;
Und zwar beinhaltet
Progman
noch einen gültigen
Handle, aber
DefView
im Fehlerfall null.
So funktionierts problemlos:
Ich speichere die Positionien und stell die Positionen gleich wieder her...
So gehts nicht:
Ich speichere die Positionen, verschieb dann ein Icon auf dem Desktop und versuch dann die Positionen wieder herzustellen.
In diesem Fall ist
DefView
null.
Ich müsste also irgendwie den Fokus (meines Erachtens) vom Desktop weg bekommen.
Oder ist irgend etwas anderes schuld daran dass das Fenster "SHELLDLL_DefView" nicht gefunden werden kann in diesem speziellen Fall?
[Edit]
Wenn ich jetzt vor dem Speichern, bzw. vor dem Wiederherstellen einmal folgendes ausführe:
Dann funktionierts jedes mal!
Gibts aber vielleicht noch eine andere, vielleicht sauberere Lösung?
[Edit 2]
Leider funktionierts nicht wirklich immer ...