首页 文章

钩子和钥匙的问题

提问于
浏览
-1

这是我到目前为止所做的尝试学习处理窗口上的钩子,按钮和消息:

in main.cpp   

    //Create a thread for keyboard:

        HANDLE hScreenThread2;

        DWORD idScreenThread2;

        hScreenThread2 = CreateThread(0, 0, (LPTHREAD_START_ROUTINE) KeyLogger, 0, 0, &idScreenThread2);

         if(hScreenThread2) {
         WaitForSingleObject(hScreenThread2, INFINITE);   
         TerminateThread(hScreenThread2, 0);                   
         CloseHandle(hScreenThread2);                                
    }

    in keylogger.cpp

        DLLEXPORT DWORD WINAPI KeyLogger ( LPVOID lpParamenter )
        {
                                         //armazena a mensagem do windows
            HINSTANCE hExe = GetModuleHandle(NULL);  //?
            //cria o hook
            hHook1 = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC) KeyBoardHook, hExe, 0);
            //loop de mensagens
            MessageLoop();
            //destrói o hook
            UnhookWindowsHookEx(hHook1);
            return 0;
        }

The message loop

    VOID MessageLoop()
    {
        MSG msg;
        while(GetMessage(&msg, NULL, 0, 0))
        {
           TranslateMessage(&msg);
           DispatchMessage(&msg);
        }     

    }

and finally the source of my headache:

    LRESULT CALLBACK KeyBoardHook( int nCode, WPARAM wParam, LPARAM lParam )

    {   
        if((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
        {
            wchar_t c;
            switch (wParam)
            {
            case WM_CHAR:
                c = (wchar_t)wParam;
                break;
            default:
                break;
            }
        }
        return CallNextHookEx(hHook1,nCode,wParam,lParam);
    }

简而言之:我无法捕捉击键,更不用说必须组合在键盘上形成重音字母的键,例如我必须按下锐音(')掉落并按下字母(e)以获得字母“ é” . 我的键盘是ABNT2巴西葡萄牙语 . 任何想法从哪里开始,因为我尝试过使用GetAsyncKeyState(),但如前所述,我有一个字母“é”我必须首先按下键('),释放它,然后按下另一个键,我不知道如何使捕获两个事件分开 . 我已经尝试了GetKeyState(0)和GetKeyboardState(kb)(kb是一个空间为256的BYTE缓冲区) .

感谢您的任何帮助或意见 .

1 回答

  • 2
    if((nCode == HC_ACTION) && (wParam == WM_KEYDOWN))
    {
        wchar_t c;
        switch (wParam)
        {
        case WM_CHAR:
            c = (wchar_t)wParam;
            break;
        default:
            break;
        }
    }
    

    if 条件仅在 wParam == WM_KEYDOWN 时评估为真 . 在这一点上, wParam 绝对不可能同时 WM_CHAR . 所以你永远不能为 c 赋值 .

    documentation解释了对于 WH_KEYBOARD_LL 钩子, wParam 的可能值是 WM_KEYDOWNWM_KEYUPWM_SYSKEYDOWNWM_SYSKEYUP . 换句话说,您将不会收到任何 WM_CHAR 消息 . 您需要自己翻译击键 . 这些问题涉及该主题:

    总之,简单的键盘布局很容易,但只要涉及到IME就非常棘手 .

相关问题