Forum: PC-Programmierung MFC und Tastatur


von Michi (Gast)


Lesenswert?

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!!!!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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"

von Micha (Gast)


Lesenswert?

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ß

von Micha (Gast)


Lesenswert?

ich habe eben was von "PreTranslateMessage(MSG* pMsg)", ich glaube die
Methode wird dabei beheflich sein!!!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Micha (Gast)


Lesenswert?

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ß

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Micha (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

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

von B. Lucas (Gast)


Lesenswert?

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.

von Karlheinz Druschel (Gast)


Lesenswert?

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.


von Knuddel P. (knopf)


Lesenswert?

wie kommt man an MFC ran. gibts da was kostenloses??

Gruß

ralf

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
Noch kein Account? Hier anmelden.