В моем ноутбуке есть цифровая клавиатура, но у него нет клавиши NumLock, а цифровая клавиатура - это всего лишь копия ряда цифр над буквами.Это подтверждается кодами виртуальных клавиш, посылаемыми при нажатии этих клавиш.
Я пытаюсь разработать небольшую программу для имитации кодов alt при нажатии клавиши alt и обычных чисел.Я использую низкоуровневую клавиатуру (у меня похожий формат, работающий в другой программе), и сначала проверяю, нажата ли какая-либо из клавиш alt.Если есть, я перебираю коды ВК 0x30-0x39 (клавиши 0-9).Если одна из них нажата в этот момент, я отменяю фактическое нажатие клавиши, возвращая значение 1, и вместо этого отправляю версию этой клавиши на цифровой клавиатуре (alt все еще нажата в это время).
Я могу подтвердить, что перехват достигнут, и что нажатие клавиши alt распознается успешно.Однако, когда я проверяю совпадения на 0-9, либо печатается только пара, прежде чем ничего не совпадет, либо мне приходится поднимать вверх и нажимать клавишу alt каждый раз, когда я нажимаю число.Кроме того, один номер может быть напечатан 16 раз после отпускания alt, нажав номер, а затем, удерживая нажатой alt, и нажав другой (это 16x).
Кроме того, я могу подтвердить, что последовательность SendInput работает путем копированиячасть от крючка, поместив его в основную функцию и заменив i на 0x30.После запуска в текстовом документе будет набрано 0.
При удерживании ALT (вниз) + 6 + 5 + ALT (вверх) в текстовом документе отображается «65».Если я добавлю еще один ALT (вниз) +6, появятся 16 шестерок.
Процедура подключения:
LRESULT CALLBACK proc (int code, WPARAM wParam, LPARAM event) //hook proc
{
if (code < HC_ACTION) //don't process if not meant to
return CallNextHookEx (0, code, wParam, event);
if (GetAsyncKeyState (VK_MENU) & 0x8000) //if either alt is down
{
for (int i = 0x30; i <= 0x39; ++i) //loop 0-9
{
if (GetAsyncKeyState (i) & 0x8000) //if index is down
{
cout << "MATCH\n"; //debug
input.ki.wVk = i + 0x30; //set VK code to numpad version of index
input.ki.dwFlags = 0; //key is being pressed
SendInput (1, &input, sizeof (INPUT)); //send keystroke down
input.ki.dwFlags = KEYEVENTF_KEYUP; //key is being released
SendInput (1, &input, sizeof (INPUT)); //send keystroke up
while (GetAsyncKeyState (i) & 0x8000) //wait for normal key to be released
Sleep (10); //don't hog CPU
return 1; //discard normal key
} //end if match
} //end for
} //end if alt
return CallNextHookEx (0, code, wParam, event); //if any key not handled, pass on
} //end function