![]() |
Frame schluckt WM_KEYDOWN-Message
Hallo an alle,
wenn ich ein Frame auf eine Form setze und dem OnKeyDown oder OnKeyUp-Event des Forms eine Handling-Methode zuweise, scheint das Frame die entsprechenden Messages irgendwie zu "verschlucken". Ich habe dazu auch schon probiert, die WndProc des Frames zu überschreiben und die Nachricht quasi manuell an das Form weiterzuleiten. Ergebnis: Wenn ich die Weiterleitung mit SendMessage oder PostMessage mache funktioniert es nicht (d.h. der Eventhandler des Forms wird nicht aufgerufen), mache ich das stattdessen über die Methode Perform (die ja direkt die WindowProc des Forms aufruft ohne den Umweg über die Windows Message Queue) geht alles einwandfrei. Jemand eine Ahnung woran das liegen könnte? Falls es einen Unterschied machen sollte: Ich nutze Delphi 2005 Professional. Danke im Voraus! PS: Hmmm, bin mir nicht ganz sicher ob das hier das richtige Forum ist. Wenn nicht, verschiebts bitte. (Z.B. in die Kategorie Bug Reports :wink: ) |
Re: Frame schluckt WM_KEYDOWN-Message
Hab noch mal ein wenig weiter damit experimentiert.
Das Frame schluckt nicht nur Keyboard messages, sondern auch z.B. eine WM_LBUTTONDOWN und andere Mouse-Messages. Daraufhin hab ich dem ganzen jetzt einen eigenen Eventhandler für WM_KEYUP und WM_KEYDOWN verpasst (protected Methoden KeyUp und KeyDown überschrieben), und zack, es klappt. Meistens. Denn wenn ich die Tasten Pfeiltaste hoch oder Pfeiltaste runter drücke, springt er gar nicht in die Methode rein. Bei anderen Tasten aber schon. Und Windows feuert definitiv eine Message ab (das habe ich nachgesehen). Und jetzt der Clou: Ich habe ein TApplicationEvents auf mein Form gepackt und in OnMessage diesen Code geschrieben:
Delphi-Quellcode:
Jetzt springt er dann tatsächlich in den entsprechenden Eventhandler. Obwohl ich ja nichts gemacht hab, als einfach nochmal eine Message zu senden.
if Msg.message = WM_KEYDOWN then
SendMessage(Frame1.Handle, WM_KEYDOWN, VK_UP, 0); Warum macht er das?!?! Was ist denn daran jetzt anders, wenn ich selbst eine Message verschick als wenn Windows das macht? Und warum ignoriert er das WM_KEYDOWN nur bei bestimmten Parametern in der Message-Struktur. :wall: |
Re: Frame schluckt WM_KEYDOWN-Message
*push*
Hab jetzt alle Updates installiert und eigentlich gehofft damit würde sich das Problem geben. Falsch gedacht. :cry: Wenn hier nicht jemand eine :idea: hat, werde ich das ganze wohl demnächst als bug reporten... :( |
Re: Frame schluckt WM_KEYDOWN-Message
Hat die Frame denn kein OnKeyDown - Event ?
Dann schreib deinen Quelltext da rein, dann müsste es gehen. Das mit dem KeyDown, KeyUp und KeyPress funktioniert sogar auch nicht wenn ein Button auf der Form ist weil die Message dann irgendwie auf andere Kontroll gerichtet ist.. |
Re: Frame schluckt WM_KEYDOWN-Message
Nee, das event gibts leider nicht. Außerdem hab ich ja auch direkt die Message abgefangen, und das geht ja auch nicht. Manche Messages kommen ja auch an. WM_KEYDOWN mit PageUp z.B. geht durch, WM_KEYDOWN mit Pfeiltaste runter wird ignoriert. Komisch.
|
Re: Frame schluckt WM_KEYDOWN-Message
Der Frame schluckt da gar nix. Wenn du einen Button auf dem Form hast und dieser den Focus hat dürftest du auch die Mousemessages nicht auf dem Form erhalten weil diese eben nicht an die Form sondern an den Button gehen. Hast du es schon mit TApplicaitonEvents versucht (oder TAppEvents, weiß nicht genau wie das heißt).
|
Re: Frame schluckt WM_KEYDOWN-Message
Also:
-ein Button ist nicht auf dem Form, und auch nicht auf dem Frame. Den Frame nutze ich quasi als "Komponente" im groben Stile einer Listview, auf dem ich zur Laufzeit "Items" aus Shapes, Labels und Images erstelle. -ApplicationEvents habe ich schon ausprobiert. Hab da die Message abgefangen und mal analysiert. Die geht schon ans richtige Handle (nämlich das des Frames, der btw auch Screen.ActiveControl--oder ist das Application.ActiveControl?--ist). -Manche WM_KEYDOWN messages gehen ja auch durch. Wenn ich z.B. PageUp oder PageDown drücke kommt die Message an, bei den Pfeiltasten nicht. -Ursprünglich hatte ich den EventHandler ja auch im Ereignis des Forms. D.h. der Frame hätte die Message bekommen, nicht verarbeitet und nach oben weitergereicht. Das Ding treibt mich nochmal zum Wahnsinn. Unter D7 hat's ja auch funktioniert. :wall: |
Re: Frame schluckt WM_KEYDOWN-Message
Die OH sagt dazu bei TForm.KeyPreview folgendes:
Zitat:
Wobei ganz nebenbei ebendiese OH dann zum Thema "Tastaturbotschaften" eben genau diese Abfrage macht! Also
Delphi-Quellcode:
Und früher gings ja auch. Passiert dieser Fehler eigentlich nur bei mir, oder könnt ihr den reproduzieren?
If Key in [VK_UP,VK_DOWN,VK_LEFT,VK_RIGHT,VK_NEXT] etc etc
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07: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