Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi WndProc funktioniert nicht mit Buttons auf Formular (https://www.delphipraxis.net/45239-wndproc-funktioniert-nicht-mit-buttons-auf-formular.html)

Poolspieler 2. Mai 2005 18:38


WndProc funktioniert nicht mit Buttons auf Formular
 
Hi,
ich möchte alle Clicks auf ein Formular mitloggen.
Dabei soll u. a. auch der Komponentenname mitgeloggt werden.
Ich wollte dies mit WndProc des Formulars machen, doch leider werden
nur Clicks auf die Formularebene oder auf labels registriert.
Für Clicks auf Buttons wird mein WndProc NICHT aufgerufen - kann mir
jemand sagen, warum das so ist (und wie ich es besser machen kann...)

Delphi-Quellcode:
procedure TForm1.WndProc(var Message: TMessage);
var
  MausPos: TPoint;
  control: TControl;
begin
  If Message.Msg = WM_LBUTTONDOWN then begin
    GetCursorPos(MausPos);
    MausPos := ScreenToClient(MausPos);
    control := form1.ControlAtPos(MausPos, false, true);
    if control = nil then
      debugdatei.schreiben('WndProc: WM_LBUTTONDOWN --- nil ---')
    else
      debugdatei.schreiben('WndProc: WM_LBUTTONDOWN ' + control.Name);
  end;
  inherited WndProc(Message);
end;
Schon mal danke

Poolspieler

jfheins 2. Mai 2005 18:39

Re: WndProc funktioniert nicht mit Buttons auf Formular
 
Probier mal, KeyPrewiew des Formulars auf True zu setzen ;)

ADD: Muss natürlich KeyPreview heißen, ist aber trotzem falsch ... (@Mirage. Eine IDE mit Rechtschreibkorrektur :shock: :mrgreen: )

Poolspieler 2. Mai 2005 18:45

Re: WndProc funktioniert nicht mit Buttons auf Formular
 
Hi,
danke, aber es bleibt leider beim gleichen Verhalten :cry:

mirage228 2. Mai 2005 18:46

Re: WndProc funktioniert nicht mit Buttons auf Formular
 
Zitat:

Zitat von jfheins
Probier mal, KeyPrewiew des Formulars auf True zu setzen ;)

Das zeigt meine OH zu KeyPrewiew :mrgreen:

Zitat:

Zitat von OH
[...] Bestimmt, ob das Formular Tastaturereignisse vor dem aktiven Steuerelement erhält.

Der Name sollte doch schon andeuten, dass da nichts mit Klick-Ereignissen ist ;)

mfG
mirage228

Mephistopheles 2. Mai 2005 18:50

Re: WndProc funktioniert nicht mit Buttons auf Formular
 
Zitat:

Zitat von Poolspieler
Ich wollte dies mit WndProc des Formulars machen, doch leider werden
nur Clicks auf die Formularebene oder auf labels registriert.
Für Clicks auf Buttons wird mein WndProc NICHT aufgerufen - kann mir
jemand sagen, warum das so ist (und wie ich es besser machen kann...)

Weil TLabel kein Fensterhandle hat und so auf die Ereignisse des Eltern-Objektes zurückgreift.
Und ansonsten mußt du nur mal nachdenken!: Fenster können sich überlappen und können andere Fenster enthalten. Wenn das Klickereignis eines Buttons nun aber vom Formular abgefangen würde, käme es ja nicht beim Button an! Damit aber das Eltern-Objekt weiß, daß der Button geklickt wurde, sendet der Button WM_COMMAND an das Eltern-Objekt.

Nachtrag: Schonmal einen lokalen Fensterhook in Erwägung gezogen?

TeTSuO 2. Mai 2005 21:12

Re: WndProc funktioniert nicht mit Buttons auf Formular
 
Hallo das Problem hatte ich auch bei mir war es ein Panel das ich abfragen wollte

Ich habe lange gesucht und habe dann rausgefunden das "Message.Msg = WM_PARENTNOTIFY" bei klick auf mein Panel war und "Message.WPARAM" dann "WM_LBUTTONDOWN" war also probier mal folgendes

Delphi-Quellcode:
procedure TForm1.WndProc(var Message: TMessage);
var
  MausPos: TPoint;
  control: TControl;
begin
  If (Message.Msg = WM_LBUTTONDOWN) or
     ((Message.Msg = WM_PARENTNOTIFY) and (Message.wParam = WM_LBUTTONDOWN)) then begin
    GetCursorPos(MausPos);
    MausPos := ScreenToClient(MausPos);
    control := form1.ControlAtPos(MausPos, false, true);
    if control = nil then
      debugdatei.schreiben('WndProc: WM_LBUTTONDOWN --- nil ---')
    else
      debugdatei.schreiben('WndProc: WM_LBUTTONDOWN ' + control.Name);
  end;
  inherited WndProc(Message);
end;

Poolspieler 3. Mai 2005 17:43

Re: WndProc funktioniert nicht mit Buttons auf Formular
 
Hallo TeTSuO,
wenn ich Dich kennen würden, dann würde ich Dir jetzt ein Bier ausgeben!!! :-D :) :P

Du hattest recht und es funktioniert wunderbar - aber wie kommt man denn auf diese Lösung?
Hast Du dafür irgendwo eine tolle Doku gefunden?

Vielen Dank und Gruß

Poolspieler

Mephistopheles 3. Mai 2005 18:55

Re: WndProc funktioniert nicht mit Buttons auf Formular
 
Zitat:

Zitat von Poolspieler
Du hattest recht und es funktioniert wunderbar - aber wie kommt man denn auf diese Lösung?
Hast Du dafür irgendwo eine tolle Doku gefunden?

Ja, da gibt es eine "tolle Doku", die jeder der unter Windows programmiert bereits auf seinem Rechner haben sollte! :roll:

http://www.microsoft.com/msdownload/...msdk/sdkupdate

Wenn du es installiert hast, findest du die entsprechenden Infos unter diesen URLs:
  • ms-help://MS.PSDK.1033/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowmessages/wm_parentnotify.htm
    Zitat:

    The WM_PARENTNOTIFY message is sent to the parent of a child window when the child window is created or destroyed, or when the user clicks a mouse button while the cursor is over the child window. When the child window is being created, the system sends WM_PARENTNOTIFY just before the CreateWindow or CreateWindowEx function that creates the window returns. When the child window is being destroyed, the system sends the message before any processing to destroy the window takes place.
  • ms-help://MS.PSDK.1033/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/createwindowex.htm
    Zitat:

    WS_EX_NOPARENTNOTIFY
    Specifies that a child window created with this style does not send the WM_PARENTNOTIFY message to its parent window when it is created or destroyed.

Da man sich darauf nicht bei allen Child-Controls verlassen kann, wurde dies (zumindest von mir) oben noch nicht angeführt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:51 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