Hallo Leute, wie kann ich mit MFC Tastaturereigniss abfangen?? 1ster Versuch: Mit Wizard habe ich eine Funktion implementiert die aufgerufen wird bei WM_KEYDOWN, beim asuführen passiert leier nicht!!!!
WM_KEYDOWN wird an das Fenster mit dem Eingabefocus gesendet - hast Du sichergestellt, daß das der Fall ist? In welche Klasse (die wovon abgeleitet ist) hast Du denn den Eventhandler eingebaut? Was genau möchtest Du erreichen? Übrigens: Falsches Forum. So ein Thema gehört nach "PC-Programmierung"
habe nur einen Handler auf WM_KEYDOWN, wird aber gar nicht ausgeführt. das mit dem "mit dem Eingabefocus gesendet " habe ich nicht verstanden! Möchte nur wissen welche Taste ist gerade gedrückt??? Wäre dankbar für ein BeispielCode?? In PC-Programmierung dauert die Antwort lange Vielen Dank nochmal für die Antwort Gruß
ich habe eben was von "PreTranslateMessage(MSG* pMsg)", ich glaube die Methode wird dabei beheflich sein!!!
Windows sendet die Nachricht WM_KEYDOWN bei gedrückter Taste nur an die Anwendung, die gerade den Eingabefocus hat. Und innerhalb der Anwendung auch nur an das Fenster, das gerade den Eingabefocus hat. Und das ist auch gut so. Wenn Du beispielsweise in einem Dialog zwei Editboxen hast, dann möchstest Du auch, daß der von Dir getippte Text in der richtigen davon erscheint - das ist die, die den Eingabefocus hat. Im Nachrichtenhandler der Fensterprozedur des jeweiligen Fensters wird (in klassischem C üblicherweise in einem switch-case-Statement, in MFC mit MessageMaps) diese Nachricht ausgewertet. Der von Dir bemühte ClassWizard kann in die MessageMap einer geeigneten Fensterprozedur einen WM_KEYDOWN-Handler einbauen - aber, wie bereits gesagt, wird der nur dann aufgerufen, wenn das entsprechende Fenster den Eingabefocus hat. PreTranslateMessage ist MFC-spezifisch und bezieht sich auf Nachrichten, die an die Anwendung mit Eingabefocus gesendet werden. Da kann man natürlich auch dran 'rumfummeln, es empfiehlt sich aber dringendst, sich vorher mit den Grundlagen beschäftigt zu haben. Grundlagen der Windows-Programmierung (ohne Berücksichtigung irgendwelcher Klassenbibliotheken) finden sich unter anderem im Petzold (Charles Petzold, "Programming Windows"). Um die Windows-Nachrichtenbehandlung zu verstehen, ist das sehr lehrreiche Lektüre - die MFC kann man ohne dieses Grundlagenwissen nicht beherrschen lernen. Wenn Du anwendungsübergreifend Tastaturereignisse auswerten willst, dann solltest Du Dir mal die Funktion SetWindowsHookEx näher ansehen (und da WH_KEYBOARD und WH_KEYBOARD_LL). PC-Programmierung ist dennoch das korrekte Forum für solche Fragen. Solltest Du einen "keylogger" schreiben wollen: Lass' es. Sowas ist nicht nur unanständig, sondern auch illegal, sofern Du es nicht nur auf Deinem eigenen Rechner für Deine eigene Nutzung installierst.
Das war sehr ausführreich, vielen Dank nochmal Das Projekt hat mit einem KeyLogger nichts zu tun, möchte nur eine Art AusfühlFormular: " Feld1:............. Feld2:............ Feld3:........... Feld1:.......... Feld2:......... . . . " so das man immer bestimmte Daten nach "Feld1:" einträgt und mit "Return-Taste" soll an der nächsten Zeile automatisch "Feld2:" erscheinen, nach "Feld2" wieder "Feld3:" und wieder von Vorne an, soviel man möchte!! deswegen habe mir gedacht ich soll die VK_RETURN abfangen!! für mich ist wichtig daß die Datei am Ende diesen bestimmten Must hat!! Wenn jemand eine andere Idee hat dann bin ich sehr dankbar! Gruß
Ah. Das macht die Sache einfacher - Du musst für die einzelnen Editfelder Deines Dialoges einen Messagehandler für WM_KEYDOWN einrichten, der dann den Focus auf das jeweils nachfolgende Editfeld setzt. Das lässt sich mit dem Classwizard erledigen und bedarf keiner Spezialitäten.
Na ja. Die übliche Methode in einem Dialog ist es, den Benutzer mit TAB von einem Eingabefeld zum nächsten zu schicken. Bleibt nur noch das Problem, dass ein Druck auf Return den Dialgo beenden würde, da das als 'Auslösen der Standardaktion in einem Dialog' aufgefasst wird. Das ist normalerweise auch gut so, nur passiert es halt schon mal dass man unbedacht in einem Edit-Feld auf Return drückt. Die Lösung dazu lautet: Im Resource-Editor in den Edit- Feldern die Check-Box 'Want-Return' aktivieren und gut ists.
ja da habt ihr schon Recht, aber das mit der WM_KEYDOWN klappt immer nicht!!!! mit dem Klassen-Assisten habe ich einen Handler auf der Nachricht "WM_KEYDOWN", und ein Break-Point drin platziert, debuge die Applikation, drücke ein Paar Tasten, passiert nichts, ausser das Schreiben im EditFeld!! habe erwartet, daß ich in der "OnKeyDown"-Handler lande!! Im Gegenteil bei, der Methode "PreTranslateMessage(MSG* pMsg)",lande ich sofort darein sobald ich was tippe!!! Muß ich dann unbedingt die "PreTranslateMessage(MSG* pMsg)" benutzen? was nutzt mir dann die "OnKenyDown"-Methode?? Gruß
Du machst irgendetwas falsch. Da wir aber keinen Code haben (und MFC Code etwas laenglich fuer dieses Forum ist) kann niemand sagen was. Ich empfehle dir eine Newsgroup in dem MFC Fragen 'on topic' sind. Dort kann man dir sicher besser helfen als hier. Auf dem Microsoft-Newgroup Server solltest du einige derartige Newsgroups finden. Geh mit deinem Newsreader nach new.microsoft.com
Es ist vielleicht ein bisschen spät aber ich hatte auch ein problem, kam auf diese diskussion und danach auf folgendes: http://www.cpp-tutor.de/mfc/mfc/kap8/tut/tut1.htm könnte dir nützlich sein.
Also ich habe hier das gleiche Problem und bin jetzt zu folgendem Ergebnis gekommen: Mit dem Klassenassistenten kann ich einen Handler für WM_KEYDOWN einrichten, aber nur in der eigentlichen Dialogklasse. Vermutlich wird das Ereignis aber an das Editfeld weitergeleitet und ich muss es dort abfangen. Ich kann aber mit dem Klassenassistenen beim Editfeld keinen Handler für das Ereignis einrichten. Es würde wohl gehen, wenn ich eine eigene Klasse von CEdit ableite und dort einen Handler einrichte. Dann eine Controlvariable für das Editfeld einrichten, wobei der Typ halt nicht CEdit ist sondern meine eigene Klasse. Ist mir aber zu aufwendig, da ich nur ein Editfeld habe. Ich benutze jetzt PreTranslateMessage, geht ganz easy.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.