Einzelnen Beitrag anzeigen

Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.336 Beiträge
 
Delphi XE2 Professional
 
#1

Fenster "SHELLDLL_DefView" wird nicht immer gefunden...

  Alt 28. Sep 2012, 19:23
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:
Delphi-Quellcode:
  Show;
  Hide;
Dann funktionierts jedes mal!
Gibts aber vielleicht noch eine andere, vielleicht sauberere Lösung?

[Edit 2]
Leider funktionierts nicht wirklich immer ...
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<

Geändert von Helmi (28. Sep 2012 um 21:51 Uhr)
  Mit Zitat antworten Zitat