Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fenster "SHELLDLL_DefView" wird nicht immer gefunden... (https://www.delphipraxis.net/170693-fenster-shelldll_defview-wird-nicht-immer-gefunden.html)

Helmi 28. Sep 2012 18:23


Fenster "SHELLDLL_DefView" wird nicht immer gefunden...
 
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
Delphi-Quellcode:
Progman
noch einen gültigen Handle, aber
Delphi-Quellcode:
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
Delphi-Quellcode:
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 ...

Helmi 29. Sep 2012 17:24

AW: Fenster "SHELLDLL_DefView" wird nicht immer gefunden...
 
*push*

Helmi 1. Okt 2012 10:58

AW: Fenster "SHELLDLL_DefView" wird nicht immer gefunden...
 
*hüstel*

Bummi 1. Okt 2012 11:16

AW: Fenster "SHELLDLL_DefView" wird nicht immer gefunden...
 
mir ist nicht klar was hiermit bezweckt wird
Delphi-Quellcode:
          If IsActiveDesktopActive then
            EnumChildWindows(DefView, @EnumDefViewProc, LPARAM(@DefView));

Helmi 1. Okt 2012 11:25

AW: Fenster "SHELLDLL_DefView" wird nicht immer gefunden...
 
Zitat:

Zitat von Bummi (Beitrag 1185231)
mir ist nicht klar was hiermit bezweckt wird
Delphi-Quellcode:
          If IsActiveDesktopActive then
            EnumChildWindows(DefView, @EnumDefViewProc, LPARAM(@DefView));

ehrlich gesagt: keine Ahnung - hab ich aus LuckieDips so übernommen


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz