Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Welche Windows Message beim Ändern der Eigenschaften Caption (https://www.delphipraxis.net/134575-welche-windows-message-beim-aendern-der-eigenschaften-caption.html)

DataCool 25. Mai 2009 10:14


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

Satty67 25. Mai 2009 11:10

Re: Welche Windows Message beim Ändern der Eigenschaften Cap
 
WM_SETTEXT klingt interessant?

DataCool 25. Mai 2009 11:56

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:
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;
Das WM_CREATE wird mir entsprechend ausgegeben, aber wenn ich z.B. die Caption eines TLabels ändere bekomme ich nichts mit :?
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

SirThornberry 25. Mai 2009 12:17

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?

Luckie 25. Mai 2009 12:32

Re: Welche Windows Message beim Ändern der Eigenschaften Cap
 
Zitat:

Zitat von DataCool
Das WM_CREATE wird mir entsprechend ausgegeben, aber wenn ich z.B. die Caption eines TLabels ändere bekomme ich nichts mit :?

Logisch. TLabel basiert auf keiner Windowsfensterklasse wie zum Beispiel TButton. TLabel erbt von TGraphicControl und hat somit zum einen kein Handle und zum anderen wird es von der VCL gezeichnet und nicht von Windows. Deshalb bekommst du auch keine WM_SETTEXT Nachricht in deinm Hook.

DataCool 25. Mai 2009 12:54

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

DataCool 26. Mai 2009 09:26

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

DataCool 23. Jul 2009 14:46

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

himitsu 23. Jul 2009 14:50

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.

DataCool 23. Jul 2009 19:54

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 08:09 Uhr.
Seite 1 von 2  1 2      

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