PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : WM_KEYDOWN hat keinen Bock :(


Matti
2003-10-29, 14:18:57
Ich will gerade mit VC++6.0 eine Tastatur-Steuerung schreiben, aber WM_KEYDOWN hat keinen Bock! Also ich hab:
rechte Maustaste aufs Formular -> Ereignisse -> WM_KEYDOWN "hinzufügen und bearbeiten". Aber der Code in OnKeyDown wird nie ausgeführt, selbst nicht, wenn ich mit dem Kopf auf die Tastatur haue ;)

Crushinator
2003-10-29, 14:45:17
Ist denn der betroffenen Klasse auch mitgeteilt worden, daß OnKeyDown vorhanden ist und auch implementiert? :naughty:


(...)
BEGIN_MESSAGE_MAP(CMyClass, CButton)
//{{AFX_MSG_MAP(CMyClass)
//ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked)
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
(...)
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);

Matti
2003-10-29, 15:08:11
BEGIN_MESSAGE_MAP(CMyClass, CButton)
//{{AFX_MSG_MAP(CMyClass)
//ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked)
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
->ist in der cpp-Datei

afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
->ist in der h-Datei

Crushinator
2003-10-29, 15:18:16
Wie sieht's mit der Implementierung in der .cpp aus?

void CMyClass:: OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CUrsprungsClass:: OnKeyDown(nChar, nRepCnt, nFlags);
if (nChar == WASAUCHIMMER)
TuWasSinnVolles();
/* Leerzeichen nach letztem : sind wegen der Verwechslung
mit vbCode des Forums eingefügt */
}


/edit: inherit (CUrsprungsClass) korrigiert.

Matti
2003-10-29, 15:27:46
also erst wollte ich nur die Tasten-Codes testen:


void CDirect_football_controlDlg:: OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufen

if (nChar==VK_UP)
{
AfxMessageBox("");
}


CDialog:: OnKeyDown(nChar, nRepCnt, nFlags);
}


Als aber nichts passierte, habe ich vor dem if noch ein AfxMessageBox eingefügt, und da habe ich gemerkt, daß OnKeyDown nie ausgeführt wird...

Matti
2003-10-29, 15:39:39
Nachdem ich das Ereignis hinzugefügt habe, kam eine Meldung "...außerhalb des Quelltext-Editors geändert...Neu laden?" und das hatte ich vorhin mit nein beantwortet, wenn man "ja" anclickt gehts!

Matti
2003-10-29, 15:50:19
...die Cursor-Tasten ergeben als nChar immer 255. Wie kann man die Cursor-Tasten abfragen?

Crushinator
2003-10-29, 16:46:17
Guckst Du hier (http://msdn.microsoft.com/library/en-us/vclib/html/_mfc_CWnd.3a3a.OnKeyDown.asp?frame=true). Du mußt nFlags auf das Extended Bit prüfen. =)


if (nFlags & 256)
{
// Extended code
switch (nChar)
{
case VK_LEFT:
(...)
}
}

Matti
2003-11-01, 17:36:12
...nChar ist dann aber trotzdem 255, oder? Jedenfalls geht dein Codestück auch nicht.

Crushinator
2003-11-01, 23:17:10
:kratz2: merkwürdig, denn ich habe gerade folgendes probiert:

if (nFlags & 256)
{
switch (nChar) {
case VK_UP: char msg[10]; AfxMessageBox(itoa(nChar,msg,10)); break;
}

und bekomme 38 angezeigt.

Matti
2003-11-03, 12:52:06
...und ich bekomme immer 255 angezeigt. Haste auch VC++6.0 und ein Dialogfeld-Projekt?

...wenn ich's mit den Cursor-Tasten nicht hinkriege, nehme ich eben das Num-Pad. Das geht jedenfalls...

Crushinator
2003-11-03, 13:11:51
Ja, ich habe mir mit dem Wizard von VC++ 6.0 (SP 5) ein solches Projekt erstellt und habe im Haupt-Dialog "PreTranslateMessage" neu implementiert, damit die "Cursor-Tasten" überhaupt durchkommen. Dann habe ich den o.g. Code eingetragen und schwupps kam die 38. :ratlos:

Matti
2003-11-03, 13:20:17
PreTranslateMessage gibts bei mir garnicht...

In welcher Datei ist PreTranslateMessage überhaupt?

Crushinator
2003-11-03, 14:57:15
"PreTranslateMessage" ist in diesem Falle ein "virtual" von "CDialog". In der ClassView rechte Maustaste auf Deine CDirect_football_controlDlg->virtuelle Funktion hinzufügen->von der linken Seite "PreTranslateMessage" auswählen->Hinzufügen und bearbeiten. Ich habe da bei mir auf die schnelle nur return false; eingetragen :freak: damit die Verarbeitung der Basisklasse nicht aufgerufen wird. In der Funktion kann man übrigens auch WM_KEYDOWN abfangen, und hier (http://www.codeproject.com/dialog/pretransdialog01.asp) findest Du sogar ein interessantes Beispiel dafür. =)

Matti
2003-11-05, 13:31:08
Danke, das mit P... überschreiben funktioniert :) Aber nur, wenn Num-Lock aus ist, sonst habe ich wieder die 255 :crazy:

Crushinator
2003-11-05, 14:36:55
:kratz2: Kann es sein, daß Du eine besondere Tastatur benutzt?

Quelle (http://msdn.microsoft.com/library/en-us/vclib/html/_mfc_CWnd.3a3a.OnKeyDown.asp?frame=true)

CWnd:: OnKeyDown
(...)
nFlags
Specifies the scan code, key-transition code, previous key state, and context code, as shown in the following list:
Value ............Description
0–7 ..............Scan code (OEM-dependent value). <- :gruebel:
(...)

For IBM Enhanced 101- and 102-key keyboards, enhanced keys are the right ALT and the right CTRL keys on the main section of the keyboard; the INS, DEL, HOME, END, PAGE UP, PAGE DOWN, and arrow keys in the clusters to the left of the numeric keypad; and the slash (/) and ENTER keys in the numeric keypad. Some other keyboards may support the extended-key bit in nFlags.

Matti
2003-11-05, 15:10:18
eigentlich ist es keine besondere Tastatur. Ist eine ganz normale von Maxdata. Das heißt so genau weiß ich auch nicht, ob es was besonderes ist, denn ich programmiere jetzt auf einem Rechner an der Hochschule, und da weiß ich natürlich nicht, was da für Schrott verbaut wurde.

Jedenfalls geht es jetzt, und danke für deine Hilfe :)