在低级别挂钩中按下键时禁用显示键

时间:2013-11-27 06:20:41

标签: visual-c++ low-level keyboard-hook

我正在尝试了解Low Level Hook。我想改变用户的输入。像这样的东西,当用户按a然后按w时,输出为ă。我的解决方案是:

  • 用户输入w后,我将使用sendInput发送2个退格键和一个unicode字符ă。

问题是:它会在退格之前显示屏幕上的w字符,我不希望这样。有什么解决方案可以在用户输入时隐藏w字符吗?

示例:这是屏幕上发生的事情

发生了什么:a - > aw - > a - > - > A

我想:a - > A

这是我的HookProcedure

    LRESULT CALLBACK InternalKeyboardHookCallback(int code, WPARAM wparam, LPARAM lparam){

    KBDLLHOOKSTRUCT *pKeyboardStruct = (KBDLLHOOKSTRUCT *)lparam;
    if(wparam == WM_KEYUP){
        if(pKeyboardStruct->vkCode==0x41){
            state = true;
        }
        if((pKeyboardStruct->vkCode==0x57)&&(state)){
            SendInput(0x08);
            SendInput(0x08);
            SendInputUnicode(0x0103);
            state = false;
        }
    }
    return CallNextHookEx(hookKeyboard, code, wparam, lparam);
}

这是SendInput和SendInputUnicode

    void SendInputUnicode(int wScan){
    INPUT input[2];
    memset(input, 0, sizeof(input));
    input[0].type = INPUT_KEYBOARD;
    //Input UNICODE
    input[0].ki.wVk = 0; // VK_PACKET
    input[0].ki.dwFlags = 4;//Send Unicode
    input[0].ki.wScan = wScan;
    input[0].ki.time = 0;
    input[0].ki.dwExtraInfo = 0;

    input[1].ki.wVk = 0; // VK_PACKET
    input[1].ki.wScan = wScan;
    input[1].ki.dwFlags = KEYEVENTF_KEYUP|4;
    input[1].ki.time = 0;
    input[1].ki.dwExtraInfo = 0;

    SendInput(2,input,sizeof(INPUT));
}

void SendInput(int wScan){
    INPUT input[2];
    memset(input, 0, sizeof(input));
    input[0].type = INPUT_KEYBOARD;
    //Input UNICODE
    input[0].ki.wVk = wScan; // VK_PACKET
    input[0].ki.dwFlags = 0;//Send Unicode
    input[0].ki.wScan = 0;
    input[0].ki.time = 0;
    input[0].ki.dwExtraInfo = 0;

    input[1].ki.wVk = wScan; // VK_PACKET
    input[1].ki.wScan = 0;
    input[1].ki.dwFlags = KEYEVENTF_KEYUP;
    input[1].ki.time = 0;
    input[1].ki.dwExtraInfo = 0;

    SendInput(2,input,sizeof(INPUT));
}

0 个答案:

没有答案