Подмена и/или отмена нажатия клавиши WinAPI

212
29 сентября 2017, 19:05

Использую глобальный хук WM_KEYBOARD_LL, для отлова сообщений о нажатых клавишах. Как при нажатии определённой клавиши отменить её действие, а лучше, переназначить его? Пример: нажали NUM PAD 5, получили 'n'. Иными словами, программное переназначение клавиши. P.S.: пробовал WH_GETMESSAGE, но он ловит только сообщения текущей программы. P.S.S.: пробовал отменить так,но не получилось:

keybd_event(key, NULL, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, NULL);
Answer 1

Для отмены нажатия клавиши, функция LowLevelKeyboardProc должна вернуть ненулевое значение. Чтобы сгенерировать свое событие нажатие клавиши, можно использовать SendInput

LRESULT CALLBACK LowLevelKeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
    KBDLLHOOKSTRUCT* details = (KBDLLHOOKSTRUCT*) lParam;
    INPUT ip;
    if(code == HC_ACTION && wParam == WM_KEYDOWN)
    {
        if(details->vkCode == code)
        {
            ip.type = INPUT_KEYBOARD;
            ip.ki.time = 0;
            ip.ki.wVk = new_code; 
            ip.ki.dwFlags = 0; 
            SendInput(1, &ip, sizeof(INPUT));
            return 1;
        }
    }
    return 0;     
}
READ ALSO
Метод не видит других переменных и другие методы класса

Метод не видит других переменных и другие методы класса

Перегруженный метод не видит другие методы класса и публичные членыИз-за чего может такое случиться?

226
Посчитать количество элементов в файле [требует правки]

Посчитать количество элементов в файле [требует правки]

Как считывать количество чисел в файле? Спасибо всем!

216
Запустить программу CreateProcess

Запустить программу CreateProcess

Как запустить консольную программу сделанную в Visual Studio через CreateProcess? Ошибок не выскакивает, но программа не запускается

274
Неверный ответ c++

Неверный ответ c++

При решении выводится не тот результат, подскажите пожалуйста,что не так

251