AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi WndProc funktioniert nicht mit Buttons auf Formular

WndProc funktioniert nicht mit Buttons auf Formular

Ein Thema von Poolspieler · begonnen am 2. Mai 2005 · letzter Beitrag vom 3. Mai 2005
Antwort Antwort
Poolspieler

Registriert seit: 9. Aug 2004
165 Beiträge
 
Delphi 10.3 Rio
 
#1

WndProc funktioniert nicht mit Buttons auf Formular

  Alt 2. Mai 2005, 18:38
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
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#2

Re: WndProc funktioniert nicht mit Buttons auf Formular

  Alt 2. Mai 2005, 18:39
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 )
  Mit Zitat antworten Zitat
Poolspieler

Registriert seit: 9. Aug 2004
165 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: WndProc funktioniert nicht mit Buttons auf Formular

  Alt 2. Mai 2005, 18:45
Hi,
danke, aber es bleibt leider beim gleichen Verhalten
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#4

Re: WndProc funktioniert nicht mit Buttons auf Formular

  Alt 2. Mai 2005, 18:46
Zitat von jfheins:
Probier mal, KeyPrewiew des Formulars auf True zu setzen
Das zeigt meine OH zu KeyPrewiew

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
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#5

Re: WndProc funktioniert nicht mit Buttons auf Formular

  Alt 2. Mai 2005, 18:50
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?
  Mit Zitat antworten Zitat
Benutzerbild von TeTSuO
TeTSuO

Registriert seit: 26. Feb 2005
Ort: Ludwigshafen am Rhein
60 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: WndProc funktioniert nicht mit Buttons auf Formular

  Alt 2. Mai 2005, 21:12
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;
”Wer immer nur das tut was er schon kann, wird immer das bleiden was er schon ist”

DiaSchau
  Mit Zitat antworten Zitat
Poolspieler

Registriert seit: 9. Aug 2004
165 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: WndProc funktioniert nicht mit Buttons auf Formular

  Alt 3. Mai 2005, 17:43
Hallo TeTSuO,
wenn ich Dich kennen würden, dann würde ich Dir jetzt ein Bier ausgeben!!!

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
Andreas
  Mit Zitat antworten Zitat
Mephistopheles
(Gast)

n/a Beiträge
 
#8

Re: WndProc funktioniert nicht mit Buttons auf Formular

  Alt 3. Mai 2005, 18:55
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!

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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 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