2008-12-04 8 views
1

La fonction ci-dessous enregistre les "0", "z" et "1" ok ... mais ne capture pas le "Z" (shift-z) ... toute aide serait appréciée ...Crochet du clavier ... n'obtenant pas les caractères majuscules ou minuscules

__declspec(dllexport) 
LRESULT CALLBACK HookProc (UINT nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if ((nCode == HC_ACTION) && (wParam == WM_KEYUP)) 
    { 
     // This Struct gets infos on typed key 
     KBDLLHOOKSTRUCT hookstruct = *((KBDLLHOOKSTRUCT*)lParam); 

     // Bytes written counter for WriteFile() 
     DWORD Counter; 

     wchar_t Logger[1]; 

     switch (hookstruct.vkCode) 
     { 
     case 060: Logger[0] = L'0'; break; 
     case 061: Logger[0] = L'1'; break; 
     case 90: Logger[0] = L'z'; break; 
     case 116: Logger[0] = L'Z'; break; 
     } 

     // Opening of a logfile. Creating it if it does not exists 
     HANDLE hFile = CreateFile(L"C:\\logfile.txt", GENERIC_WRITE, 
      FILE_SHARE_READ, NULL,OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

     // put the file pointer to the end 
     SetFilePointer(hFile,NULL,NULL,FILE_END); 

     // Write the hFile typed in logfile 
     WriteFile(hFile,&Logger,sizeof(Logger),&Counter,NULL); 

     //WriteFile(hFile,&hookstruct.vkCode,sizeof(hookstruct.vkCode),&Counter,NULL); 
     // Close the file 
     CloseHandle(hFile); 
    } 
} 

Répondre

10

Le clavier n'envoie pas caractères. Il envoie touches. Si vous tapez z ou Z, vous appuyez toujours sur la même touche et cette touche a le même code VK deux fois.

Vous devriez également recevoir une notification lorsque la touche Maj est enfoncée ou relâchée. Vous pouvez utiliser ces notifications pour traduire les séquences de touches en caractères. L'état caps-lock sera également pertinent pour cela. Vous pouvez également être préoccupé par les clés mortes.

Vous pouvez vérifier si la touche Maj est enfoncée. GetAsyncKeyState vous dira l'état de la clé dès maintenant, et GetKeyState vous dira l'état de la clé à partir du dernier message retiré de la file d'attente de messages.

+0

Quatre ans de retard, mais merci pour cette réponse. M'aider :) :) –

+0

J'ajouterais à cette réponse que si vous allez travailler dans un environnement multilingue, vous pourriez avoir des problèmes plus graves, car votre processus et votre source de processus de kbd peuvent avoir un langage différent. Par exemple. Votre processus a Eng actif, et si l'utilisateur passe à Rus dans un autre processus et appuie sur "Й" - vous pouvez obtenir "Q" parce que c'est la même touche physique sur le clavier. Voir aussi cette réponse: http://stackoverflow.com/questions/10718009/difference-between-wh-keyboard-and-wh-keyboard-ll –

+0

@IvanDanilov: Vous confondez * les codes de balayage * avec les * codes de touches virtuelles *. 'Й' et' Q' peuvent avoir le même code de balayage, puisqu'ils partagent la même clé physique sur un clavier. Cela n'implique pas de codes de clé virtuelle identiques. – IInspectable

6

Il n'y a pas de code clé virtuelle pour Z. Essayez quelque chose comme ceci:

  case 90: 
       if(GetKeyState(VK_LSHIFT|VK_RSHIFT) 
        Logger[0] = L'Z'; break; 
       else 
        Logger[0] = L'z'; break; 
+0

Vous voulez l'état de clé ** synchrone ** du modificateur. Si vous écrivez keyloggers à ce niveau de qualité, je ne suis pas très préoccupé par les menaces de sécurité. – IInspectable

+1

Vous pourriez avoir aussi bien suggéré une édition sans renverser votre thé de paranoïa; et non, je n'écris certainement pas les keyloggers de l'espace utilisateur. – arul

+0

Je proposerais de supprimer complètement la réponse. Il n'ajoute rien d'utile, et manque complètement la question. Vous distribuez des armes et des aides à la ceinture. [Rob Kennedy] (http://stackoverflow.com/a/342260/1889329) ci-dessus l'a frappé directement. Le clavier ne concerne pas les caractères ou les glyphes. Bien que vous fournissiez une solution (mal conçue) pour distinguer les caractères latins majuscules et minuscules, elle échoue pour chaque entrée de substitution (par exemple 'é'). Et les clés mortes ne sont qu'un autre exemple, où cela échoue. J'ai downvoted cette réponse, parce qu'elle est trompeuse. – IInspectable

Questions connexes