Schluss mit Lustig: Cursortasten



  • Hi!

    Bei meinem vorigen Projekt habe ich das Problem gehabt und nun
    schon wieder.

    Schritt 1: Ich erstelle eine einfache, dialogfeldbasierende MFC Anwendung mit VC++ 6.0

    Schritt 2: Ich mache mir im Klassenassistenten eine OnKeyDown Funktion für die Nachricht WM_KEYDOWN

    Schritt 3: Ich füge zu Testzwecken ein MessageBeep(MB_OK) in die Funktion ein, um zu schauen bei welchen Tasten diese Funktion greift.

    Schritt 4: Ich stelle frustriert fest, dass sie bei den hinauf/hinunter/rechts/links Cursortasten nicht Beept, sprich dass sie nicht aufgerufen wird.

    Schritt 5: Ich mache das gleiche für die WM_KEYUP Nachricht und siehe da: Er piept bei den Cursortasten!

    Ich brauche aber unbedingt die WM_KEYDOWN!!!
    (ich programmiere gerade eine - jetzt komplett - objektorientierte Shell mit eigener Schriftart und soweiter und da ist es höchst unangenehm wenn der Cursor nur bei jedem Loslassen der Taste herumrückt...)

    Ich glaube jeder kann mein Problem nachvollziehen!

    bitte um hilfe

    danke
    matthias



  • hi nochmals

    ich habe jetzt (nach 3 Stunden) einen Weg gefunden, das alles zu umgehen:
    Ich habe mit dem Klassenassistenten eine WindowProc erstellt (das wusste ich vorher gar nicht, dass man das kann) die messages von dort aus ausgefiltert.
    Bin auf was seltsames draufgekommen: die WM_KEYDOWN für die rechte Cursortaste wird zweimal geschickt... wieso weiß ich nicht.

    schöne grüße
    Matthias



  • Das Problem dürfte eigentlich sein das die WM_KEYDOWN Message an das aktive steuerelemnt gesendet wird wenn eins da ist und nicht an dein Hauptfenster. Nomrmalerweise kannst du das Umgehen indem du die PretranslateMessage Funktion überschreibst und dort auf die WM_KEYDOWN reagierst.



  • Das Problem ist höchstwahrscheinlich nur, dass innerhalb von Dialogen die WM_KEYDOWN für die Cursortasten dafür benutzt wird, um zwischen Controls einer Gruppe den Fokus zu wechseln. Danach wird die Message als behandelt abgetan. Wahrscheinlich gibt IsDialogMessage einfach TRUE zurück!
    D.h. wenn Du nicht immer PreTranslateMessage überschreiben willst, solltest Du ein 'normales' Fenster verwenden.


Anmelden zum Antworten