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
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?