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);
    }
}
Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top