![]() |
Welche Windows Message beim Ändern der Eigenschaften Caption
Hi Leute,
ich möchte mit bekommen, wenn sich die Caption oder der Hint eines Controls oder der Action des Controls ändert. Ich habe schon einen aktiven Hook("WH_CALLWNDPROC") am laufen, welche Windows Message muss ich dazu abfangen ? Das ganze muss für TWincontrols und auch für TControls funktionieren ? Jemand eine Idee ? Danke im vorraus, Greetz Data |
Re: Welche Windows Message beim Ändern der Eigenschaften Cap
WM_SETTEXT klingt interessant?
|
Re: Welche Windows Message beim Ändern der Eigenschaften Cap
Hi Satty,
hätte ich erwähnen sollen: "WM_SETTEXT" hatte ich auch vermutet, allerdings kommt diese nicht in meinem Hook an :? Hier mal ein wenig Code:
Delphi-Quellcode:
// Hook starten
FWndHook := SetWindowsHookEx(WH_CALLWNDPROC, pWndProcInst, 0, GetCurrentThreadId());
Delphi-Quellcode:
Das WM_CREATE wird mir entsprechend ausgegeben, aber wenn ich z.B. die Caption eines TLabels ändere bekomme ich nichts mit :?
function TXYZ.CbWndProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var cwps: TCWPStruct; tmpControl : TControl; tmpParentControl : TScrollingWinControl; begin case nCode < HC_ACTION of True: begin Result := CallNextHookEx(FWndHook, nCode, wParam, lParam); end; else begin CopyMemory(@cwps, Pointer(lParam), SizeOf(CWPSTRUCT)); case cwps.message of WM_SYSCOMMAND : begin DebugMsg('WM_SYSCOMMAND hwnd: '+inttostr(cwps.hwnd)+'wParam: '+inttostr(wParam)+' lParam: '+inttostr(lParam)); // Control zu Handle ermitteln tmpControl := FindControl(cwps.hwnd); // Control gefunden ? if Assigned(tmpControl) then begin DebugMsg('WM_SYSCOMMAND '+tmpControl.ClassName); end; end; CM_TEXTCHANGED : begin DebugMsg('CM_TEXTCHANGED hwnd: '+inttostr(cwps.hwnd)); // Control zu Handle ermitteln tmpControl := FindControl(cwps.hwnd); // Control gefunden ? if Assigned(tmpControl) then begin DebugMsg('CM_TEXTCHANGED '+tmpControl.ClassName); end; end; WM_SETTEXT : begin // Control zu Handle ermitteln tmpControl := FindControl(cwps.hwnd); // Control gefunden ? if Assigned(tmpControl) then begin DebugMsg('WM_SETTEXT '+tmpControl.ClassName); end; end; WM_CREATE : begin // Control zu Handle ermitteln tmpControl := FindControl(cwps.hwnd); // Control gefunden ? if Assigned(tmpControl) then begin DebugMsg('WM_CREATE '+tmpControl.ClassName); end; end; end; end; end; Ausser ein WM_PAINT glaube ich, aber da muss doch noch was anderes als Message kommen oder wird das bei TControl wirklich abhängig von der Klasse im Paint abgefackelt ? Greetz Data |
Re: Welche Windows Message beim Ändern der Eigenschaften Cap
Was genau hast du vor? Vielleicht gibt es ja eine bessere Möglichkeit. Auf den ersten Blick frage ich mich warum man sowas macht. Wenn du die Caption irgendwo per Quelltext änderst so hast du doch selbst den Quelltext dazu geschrieben und weißt auch das du etwas machst. Warum also nicht an der Stelle wo du etwas änderst darauf reagieren alsl ständig global alles zu überwachen?
|
Re: Welche Windows Message beim Ändern der Eigenschaften Cap
Zitat:
|
Re: Welche Windows Message beim Ändern der Eigenschaften Cap
@SirThornberry:
Hört sich etwas komisch an, aber hinter dem "Unsinn" steckt Methode, oder auch nicht :gruebel: Sinn und Zweck der Geschichte ist es eine Komponente zu Schreiben die eine Art von Multilanguagefähigkeit realisiert. Bitte jetzt keine Diskusion über andere Ansätze, denn der Ansatz wurde mirt vorgegeben ! Ich gebe dem "User" die Möglichkeit in der Anwendung einen Translator-Modus zu aktivieren. In diesem Modus kann der User die Komponenten die Übersetzt werden soll auswählen, indem er sie einfach anklickt. Die Übersetzungen werden in einer XML Datei abgelegt und bei "CREATE" der Komponenten entsprechend gesetzt. Wenn jetzt aber im Programm manuell eine Caption, Hint .. etc. geändert wird bekomme ich das nicht mit .... Frage beantwortet ? @Luckie: Mir war es schon klar das TLabel kein Fensterhandle hat, aber es muss doch trotzdem eine Möglichkeit geben herraus zu bekommen, wann z.B. die Caption geändert wurde, oder sehe ich das falsch ? Greetz Data |
Re: Welche Windows Message beim Ändern der Eigenschaften Cap
Hi,
habe jetzt noch ein wenig getestet und bin im Moment der Meinung, das die Message: "CM_Textchanged" genau das ist was ich brauche, allerdings wird diese nur intern in der VCL verwendet und kommt nicht in meinem WndProc für Windows Messages an. Hat jemand eine Idee wie ich diese Message Global in einer Anwendung abfangen kann ? Oder muss ich jetzt zu jedem Control was mich interessiert die procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED; überschreiben ? Bin für jede Anregung dankbar, Greetz Data |
Re: Welche Windows Message beim Ändern der Eigenschaften Cap
*push*
Hat sich leider noch nicht erledigt :-( Ich brauche die Möglichkeit bei X Komponenten unterschiedlichen Typs, einzige Gemeinsamkeit die Eigenschaften "Caption/Hint" sind verfügbar, mitzubekommen wann sich eine der Eigenschaften(CapTion/Hint) ändert. Bin für jede Idee/Anregung dankbar, Greetz Data |
Re: Welche Windows Message beim Ändern der Eigenschaften Cap
für's Label: leite dir eine neue Komponente von TLabel ab und implementiere dir ein OnCaptionChange.
|
Re: Welche Windows Message beim Ändern der Eigenschaften Cap
Hi Himitsu,
die Idee ist nicht schlecht, allerdings kann ich das nicht auf ein bestehendes Projekt mit mehr als 1 Million Zeilen anwenden. Greetz Data |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 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