![]() |
Re: Ich finde keine ChildHandles beim TSaveDialog ...
So, jetzt hab ich die verschiednen Tips kombiniert und hab die IMHO beste Lösung gewfunden ;)
Delphi-Quellcode:
Der Vorteil wenn man über die ItemID geht liegt darin, dass man jetzt sogar die Captions der Buttons und Labels ändern kann ;)
wnd := FindWindow('#32770',PChar(SaveDialog1.Title));
wnd := GetDlgItem(wnd, 1148); if wnd <> 0 then begin showmessage('// ....gefunden!'); end; |
Re: Ich finde keine ChildHandles beim TSaveDialog ...
@Frifra: Wer sagt dir aber dass, das handle was dir findwindow zurück gibt auch wirklich von deinem dialog ist und nicht das handle eines fensters aus einer anderen anwendung?
wenn ich folgendes auf meinem Rechner ausführe bekomme ich 4 handles in meiner Listbox was also auch heißt das es 4 Fenster mit dem Classname gibt. Somit wäre deine Variante nicht sehr zuverlässig.
Delphi-Quellcode:
bei der variante von Toms ist es auch nicht anders, da kann es ganauso passieren das man entweder kein handle zurück bekommt oder das von einem anderen dialog.
var LHandle: Cardinal;
LStr: PChar; begin LStr := StrAlloc(255); LHandle := FindWindow('#32770', nil); while (LHandle <> 0) do begin GetClassName(LHandle, LStr, 254); if LStr = '#32770' then ListBox1.Items.Add(inttostr(LhANDLE)); LHandle := GetWindow(LHandle, GW_HWNDNEXT); end; StrDispose(LStr); end; Wenn du das ganze wie folgt erweiterst kannst du wenigstens sicherstellen dass, das gefundene Fenster zu deiner Anwendung gehört:
Delphi-Quellcode:
var LHandle: Cardinal;
LStr: PChar; begin LStr := StrAlloc(255); LHandle := FindWindow('#32770', nil); while (LHandle <> 0) do begin GetClassName(LHandle, LStr, 254); if LStr = '#32770' then begin if GetWindow(LHandle, GW_OWNER) = Application.Handle then EnumChildWindows(LHandle, @EnumProc, 0); end; LHandle := GetWindow(LHandle, GW_HWNDNEXT); end; StrDispose(LStr); end; |
Re: Ich finde keine ChildHandles beim TSaveDialog ...
Zitat:
Delphi-Quellcode:
Ich hab aber gerade festgestellt, das es beim Überschreiben der Buttoncaptions Probleme gibt...
wnd := FindWindow('#32770',PChar(SaveDialog1.Title));
Delphi-Quellcode:
Mache ich das ganze im onShow, wird die Caption von Windows sofort wieder überzeichnet... lagere ich das ganze in einen Timer mit kurzem Interval aus, so hat mam bei jeder Dateiauswahl (-> Neuzeichnen des gesamten Dialoges) ein "lustiges Blinkespiel", weil jedesmal wieder kurz die Originalcaption zu sehen ist :roll:
var
wnd: HWND; Tmp: string; Buffer: array[0..MAX_PATH] of Char; n: integer; begin wnd := FindWindow('#32770', PChar(SaveDialog1.Title)); wnd := GetDlgItem(wnd, 1); if wnd <> 0 then begin GetWindowText(wnd, Buffer, MAX_PATH); Tmp := 'Teest'; if StrPas(Buffer) <> Tmp then SetWindowText(wnd, PChar(Tmp)); end; |
Re: Ich finde keine ChildHandles beim TSaveDialog ...
reicht es nicht das du einmal die caption setzt und dann den timer abschaltest?
|
Re: Ich finde keine ChildHandles beim TSaveDialog ...
Nein, sobald man z.B. eine Datei auswählt, werden alle Buttoncaptions neu gezeichnet... natürlich wieder mit den originalwerten :x
|
Re: Ich finde keine ChildHandles beim TSaveDialog ...
da du die handles der Buttons hast könntest du die Windowproc umlenken und die messages zum setzen der Caption einfach verwerfen
|
Re: Ich finde keine ChildHandles beim TSaveDialog ...
Und wie mach ich das?
Wenn ich das hinbekäme könnte ich endlich mal alle Captions der Standardialoge ändern, was für mehrsprachige Anwendungen sehr gut ist ;) |
Re: Ich finde keine ChildHandles beim TSaveDialog ...
komich, ich hab grad mal die buttoncaption für "öffnen" geändert und diese wurde nicht zurück geändert als ich eine Datei gewählt habe oder den Ordner gewechselt. Wie man die Windowproc umbiegt - ich bastels mal schnell zamm
[Edit] So wirds gemacht
Delphi-Quellcode:
in der NewWindowProc kannst du dann wm_settext verwerfen bzw. abändern
//variable für die alte windowproc
var GOldProc: function(AHandle: Cardinal; uMsg: Cardinal; AWPARAM: wParam; ALPARAM: lParam): LResult; Stdcall; //unsere neue Windowproc function NewWindowProc(AHandle: Cardinal; uMsg: Cardinal; AWPARAM: wParam; ALPARAM: lParam): LResult; Stdcall; begin result := GOldProc(AHandle, uMsg, AWParam, ALParam); end; [...] //umbiegen auf neue windowproc und sichern der alten für inherited call Integer(@GOldProc) := SetWindowLong(LHandle, GWL_WNDPROC, Integer(@NewWindowProc)); [...] |
Re: Ich finde keine ChildHandles beim TSaveDialog ...
Bei "Integer(@NewWindowProc)" kommt bei mir immer der Fehler "Variable erforderlich"...
|
Re: Ich finde keine ChildHandles beim TSaveDialog ...
dann versuch mal ob es geht wenn du das "@" wegmachst, unter d5 ging es ohne "@" wenn ich mich recht entsinne, mein Delphi7 hingegen meckert rum. Ansonsten kannst du den Cast auch um den anderen Teil machen (also auf den Proceduretype casten)
also so:
Delphi-Quellcode:
type
TWindowproc = function(AHandle: Cardinal; uMsg: Cardinal; AWPARAM: wParam; ALPARAM: lParam): LResult; Stdcall; [...] var GOldProc: TWindowProc; [...] GOldProc := TWindowProc(SetWindowLong(LHandle, GWL_WNDPROC, Integer(@NewWindowProc))); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:52 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