Probleme mit virtuellem Tastencode VK_F10



  • Wenn ich F10 drücke, sind alle anderen im Switch verwendeten Tasten blockiert, bis ich F10 das zweite Mal drücke. Erst danach gehen die anderen F-Tasten wieder. Bei den anderen Tasten klappt alles normal.

    Ich habe das compilierte Programm auch auf einem anderen Rechner ausprobiert (gleiches Resultat - es ist also nicht die Tastatur).

    Ich benutze BCB6 Enterprise Trial. Kann das jemand nachvollziehen. Oder könnte es an dem Rechner liegen, auf dem es compiliert wird?

    Ich habe den Code mal stark vereinfacht - es kommt aber immer das gleiche heraus:
    (das ganze liegt auf dem Event OnKeyDown bei z.B. Button1

    void __fastcall TForm1::FKeyDown(TObject *Sender, WORD &Key,
          TShiftState Shift)
    {
     char FKey1[] = "C:\\WINDOWS\\MEDIA\\Robotz Windows starten.wav";
     char FKey2[] = "C:\\WINDOWS\\MEDIA\\Musica Windows starten.wav";
    
     switch (Key)
      {
         case VK_F1:
                    PlaySound(FKey1, NULL, SND_FILENAME | SND_ASYNC);
            break;
         case VK_F2:
                    PlaySound(FKey2, NULL, SND_FILENAME | SND_ASYNC);
            break;
         case VK_F3:
                    PlaySound(FKey1, NULL, SND_FILENAME | SND_ASYNC);
            break;
         case VK_F4:
                    PlaySound(FKey2, NULL, SND_FILENAME | SND_ASYNC);
            break;
         case VK_F5:
                    PlaySound(FKey1, NULL, SND_FILENAME | SND_ASYNC);
            break;
         case VK_F6:
                    PlaySound(FKey2, NULL, SND_FILENAME | SND_ASYNC);
            break;
         case VK_F7:
                    PlaySound(FKey1, NULL, SND_FILENAME | SND_ASYNC);
            break;
         case VK_F8:
                    PlaySound(FKey2, NULL, SND_FILENAME | SND_ASYNC);
            break;
         case VK_F9:
                    PlaySound(FKey1, NULL, SND_FILENAME | SND_ASYNC);
            break;
         case VK_F10:
                    PlaySound(FKey2, NULL, SND_FILENAME | SND_ASYNC);
            break;
         case VK_F11:
                    PlaySound(FKey1, NULL, SND_FILENAME | SND_ASYNC);
            break;
         case VK_F12:
                    PlaySound(FKey2, NULL, SND_FILENAME | SND_ASYNC);
            break;
         default:
                    PlaySound("", NULL, SND_FILENAME | SND_ASYNC);
            ;
      }   //
    }
    


  • Das wird wohl daran liegen, dass F10 unter Windows standardmässig als Hotkey für das Aktivieren des MainMenus reserviert ist. Scheinbar greift das auch, wenn das Programm kein Menü enthält.

    Keine Ahnung, ob und wie man das umgehen kann.



  • Dein Ansatz war auf jeden Fall der Stoß in die richtige Richtung, da wenn ich vorher einem MessageDlg mit Key als Parameter ausgegeben habe, erschien beim Bestätigen mit Space immer das Kontextmenü. Das ist wiederum auch nur bei Auslösen durch F10 so.

    Jetzt habe ich die Eigenschaft BorderStyle mal auf bsNone gestellt und siehe da - der Bug ist behoben.

    Jetzt hat die Sache nur noch einen kleinen Haken, denn ich wollte auf das Systemmenü eigentl. nicht verzichten. Gibt es eine denn Möglichkeit das Kontextmenü von der Systemmenüleiste zu entfernen?



  • Einfach aber wirkungsvoll: 😉

    case VK_F10: 
       PlaySound(FKey2, NULL, SND_FILENAME | SND_ASYNC); 
       Key = 0;
       break;
    


  • Super 😋 - so einfach kanns sein. Hab da wohl wieder mal viel zu kompliziert gedacht.

    Many thanks


Anmelden zum Antworten