Skiv Hisink
Skiv Hisink

Reputation: 166

How to fix"Ignored keystrokes"

My problem is that after adding catching keys, my code began to work not quite correctly.

In more detail: The task of a program after pressing a key combination (in my case it is CTRL + q and CTRL + e) is to simulate a keystroke in some program. Everything worked if you use the button in the program, but after adding the catch, the arrows stopped working (Enter and Esc work, I did not check the rest of the keys).

I need this for fast serch in some programms, where you must press arrows on your keyboard a lot of times.

__declspec(dllexport) LRESULT CALLBACK KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam)
{
    DWORD CTRL_key = 0;

    if ((nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN)))
    {
        KBDLLHOOKSTRUCT hooked_key = *((KBDLLHOOKSTRUCT*)lParam);
        DWORD dwMsg = 1;
        dwMsg += hooked_key.scanCode << 16;
        dwMsg += hooked_key.flags << 24;
        char lpszKeyName[1024] = { 0 };

        int i = GetKeyNameText(dwMsg, (lpszKeyName + 1), 0xFF) + 1;

        int key = hooked_key.vkCode;

        CTRL_key = GetAsyncKeyState(VK_CONTROL);

        if (key >= 'A' && key <= 'Z')
        {

            if (CTRL_key != 0 && key == 'q')
            {
                //MessageBox(NULL, "Pressed", "H O T K E Y", MB_OK);
                CTRL_key = 0;
                //
                Sleep(1000);
                keybd_event(VK_RETURN, 0x9C, 0, 0);
                Sleep(50);
                keybd_event(VK_RETURN, 0x9C, KEYEVENTF_KEYUP, 0);
                Sleep(100);
                for (int i = 0; i < 6; i++) {
                    keybd_event(VK_UP, 0x26, 0, 0);
                    Sleep(50);
                    keybd_event(VK_UP, 0x26, KEYEVENTF_KEYUP, 0);
                    Sleep(50);
                }
                for (int i = 0; i < 5; i++) {
                    keybd_event(VK_RIGHT, 0x27, 0, 0);
                    Sleep(50);
                    keybd_event(VK_RIGHT, 0x27, KEYEVENTF_KEYUP, 0);
                    Sleep(50);
                }
                keybd_event(VK_DOWN, 0x28, 0, 0);
                Sleep(50);
                keybd_event(VK_DOWN, 0x28, KEYEVENTF_KEYUP, 0);
                keybd_event(VK_RETURN, 0x9C, 0, 0);
                Sleep(50);
                keybd_event(VK_RETURN, 0x9C, KEYEVENTF_KEYUP, 0);
                Sleep(50);
                Sleep(6000);
                keybd_event(VK_ESCAPE, 0x1B, 0, 0);
                Sleep(500);
                keybd_event(VK_ESCAPE, 0x1B, KEYEVENTF_KEYUP, 0);
                Sleep(1000);
            }

            if (CTRL_key != 0 && key == 'e')
            {
                MessageBox(NULL, "Shutting down", "H O T K E Y", MB_OK);
                PostQuitMessage(0);
            }

            CTRL_key = 0;
        }

    }
    return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
}

Click here if you want to see the whole code! Thank you in advance!

Upvotes: 1

Views: 204

Answers (1)

Skiv Hisink
Skiv Hisink

Reputation: 166

The solution was simple. In the function, when you clicked the arrows, another parameter was needed.

                    keybd_event(VK_UP, 0x26, KEYEVENTF_EXTENDEDKEY, 0);
                    Sleep(50);
                    keybd_event(VK_UP, 0x26, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

Upvotes: 1

Related Questions