Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   OpenFileDialog subclassing (https://www.delphipraxis.net/206175-openfiledialog-subclassing.html)

venice2 26. Nov 2020 15:54

OpenFileDialog subclassing
 
Ich subclasse den Openfiledialog.
Wenn ich nun den Ordner bzw. Pfad ändere addieren sich die tooltips_class32 diese werden dann nach dem schließen des Dialogs nicht mehr entfernt.
Es liegt daran weil ich die Message DESTROY nicht weiterleite.

Das Problem.
Delphi-Quellcode:
    WM_DESTROY:
      begin
        SysListUnSubClass(WinHandle); // Muss beendet werden

        sbHookedScroolBar := nil;
        hSysList := 0;
        Result := 1;
        Exit;
      end;
Beim beenden wird die Subclass beendet wenn ich nun die Message weiterlaufen lasse also

Delphi-Quellcode:
    WM_DESTROY:
      begin
        SysListUnSubClass(WinHandle);

        sbHookedScroolBar := nil;
        hSysList := 0;
      end;
Dann kracht es weil
Delphi-Quellcode:
Result := CallWindowProc(FPrevSysListProc, WinHandle, Msg, wp, lp);

der Pointer FPrevSysListProc dann nicht mehr gültig ist.

Beim wechsel auf einen anderen Folder wird das ListLiew zerstört deshalb muss ich das alte Subclassing beenden und hier neu zuweisen
weil sich das Handle des ListView geändert hat.
Delphi-Quellcode:
          CDN_FOLDERCHANGE:
            begin
              if OpenDialog.UseSkin then
              begin
                if (hSysList = 0) then
                begin
                  hDefview := FindWindowEx(DlgHandle, 0, 'SHELLDLL_Defview', nil);
                  hSysList := FindWindowEx(hDefview, 0, 'SysListView32', nil);

                  if hSysList <> 0 then
                  begin
                    SysListSubClass(hSysList); // neu

                    if not Assigned(sbHookedScroolBar) then
                      OpenDialog.HookedScroolBar;

                    if hHeader = 0 then
                    begin
                      hHeader := ListView_GetHeader(hSysList);
                      HeaderSubClass(hHeader);
                    end;
                  end;
                end;
                SetFocus(SKDialogHandle);
              end;
              Result := 1;
              Exit;
            end;
solange wie ich die Message WM_DESTROY mit 1 zurückgebe ist alles in Ordnung nur dann werden mir immer neue tooltips_class32 addiert die sich dann beim beenden nicht löschen.
Wo ist mein Denkfehler so das ich das beheben kann?

Ich muss also das Subclassing an anderer stelle beenden nur wo.
Habe es mit WM_LBUTTONDOWN in der TOOLBAR Proc versucht nur wie komme ich an die ID der jeweiligen Button die ich klicke?

venice2 27. Nov 2020 19:42

AW: OpenFileDialog subclassing
 
Irgendwie kommen hier keine Rückmeldungen mehr bei meinen Beiträgen. Nun gut habe es selbst gelöst

Delphi-Quellcode:
var
  bSysList: BOOL;
Delphi-Quellcode:
WM_DESTROY:
  bSysList := True;
Delphi-Quellcode:
CDN_FOLDERCHANGE:
  begin
    if OpenDialog.UseSkin then
    begin
      if bSysList then
      begin
        SysListUnSubClass(hSysList);
        CTRL_HookedScroolBarDestroy;
        sbHookedScroolBar := nil;
        hSysList := 0;

        hDefview := FindWindowEx(DlgHandle, 0, 'SHELLDLL_Defview', nil);
        hSysList := FindWindowEx(hDefview, 0, 'SysListView32', nil);

        if hSysList <> 0 then
        begin
          SysListSubClass(hSysList);

          if not Assigned(sbHookedScroolBar) then
            OpenDialog.HookedScroolBar;

          if hHeader = 0 then
          begin
            hHeader := ListView_GetHeader(hSysList);
            HeaderSubClass(hHeader);
          end;
          bSysList := false;
        end;
      end;
      SetFocus(SKDialogHandle);
    end;
    Result := 1;
    Exit;
  end;
jetzt werden alle tooltips_class32 freigegeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:44 Uhr.

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