1

以下の関数は、「0」、「z」、および「1」をログに記録しています...しかし、「Z」(shift-z)をキャプチャしていません...助けていただければ幸いです...

__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);
    }
}
4

2 に答える 2

10

キーボードは文字を送信しません。キーを送信します。zまたはZを入力しているかどうかにかかわらず、同じキーを押しており、そのキーには両方とも同じ VK コードがあります。

Shift キーを押したり離したりしたときにも通知を受け取る必要があります。これらの通知を使用して、キーストロークを文字に変換できます。caps-lock 状態もそれに関連します。デッドキーについても心配するかもしれません。

Shiftキーが押されているかどうかを確認できます。GetAsyncKeyStateは、現在GetKeyStateキーの状態を示し、メッセージ キューから最後にメッセージが削除された時点でのキーの状態を示します。

于 2008-12-04T22:02:47.637 に答える
6

Z の仮想キー コードはありません。次のようにしてみてください。

            case 90:
                 if(GetKeyState(VK_LSHIFT|VK_RSHIFT)
                     Logger[0] = L'Z'; break;
                 else
                     Logger[0] = L'z'; break;
于 2008-12-04T21:49:25.430 に答える