windows - Virtuel nøglekode for ALT KEY

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg laver kroge og fanger tastaturets virtuelle nøglekoder, ifølge MSDN er disse nøglekoderne der eksisterer. [13]


Hver nøglekode fungerer fint, da jeg vil give et eksempel nedenunder af min kode.


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

HHOOK altKey;
KBDLLHOOKSTRUCT kbdHK;
MSG message;

LRESULT CALLBACK kbdProc(int nCode, WPARAM wPar, LPARAM lPar);

int main(int argc, char *argv[]) {
  altKey = SetWindowsHookEx(WH\_KEYBOARD\_LL, kbdProc, NULL, 0);

  while(GetMessage(&message, NULL, 0, 0) > 0){
    TranslateMessage(&message);
    DispatchMessage(&message);
  }
  return 0;
}

LRESULT CALLBACK kbdProc(int nCode, WPARAM wPar, LPARAM lPar){

  if(nCode >= 0){
    if(wPar == 256){
      kbdHK = *(KBDLLHOOKSTRUCT *)lPar;
      if(kbdHK.vkCode == 0x20){
        printf("spacebar pressed!!
");
      }
    }
  }
  return CallNextHookEx(NULL, nCode, wPar, lPar);
}


Men når jeg erstatter den virtuelle nøglekode med 0x12, som er ALT KEY i henhold til MSDN, kan jeg ikke få et resultat tilbage. Hvad kunne problemet være? [14]


Rediger :


Når jeg bruger denne kode kode, kan jeg få scanCode for hver nøgle, men ikke for alt-tasten igen, hvilket er interessant.


printf("\%d", kbd.scanCode); 

Bedste reference


Jeg foreslår at tilslutte WM\_SYSKEYDOWN beskederne og notere at værdierne svarer til konstanter, der oftest har egentlige identifikatorer (VK\_MENU, i dette tilfælde). Som programlærer lærer vi os tidligt ikke at bruge magiske tal ! [15]



  WM\_SYSKEYDOWN meddelelse

  
   Sendt til vinduet med tastaturets fokus, når brugeren trykker på F10-tasten (som aktiverer menulinjen) eller holder ALT-tasten nede og derefter trykker på en anden tast.



En anden mulighed, som påpeget i kommentarerne, er at bruge GetAsyncKeyState. Dine bekymringer om at du ikke kan bruge vkCode virker mærkeligt, da GetAsyncKeyState s parameter er den virtuelle nøglekode, trods alt, så koden du vil bruge ville være i overensstemmelse med: [16]


short result = GetAsyncKeyState(VK\_MENU);
if (!result) {
    // no alt keystrokes since last call
}


Dette er især det eneste, du kan skelne mellem venstre alt (VK\_LMENU) og højre alt (VK\_RMENU) nøgler, men det er heller ikke . Nu har du begge.