У моего ноутбука есть номерная панель, но у нее нет клавиши NumLock, а numpad - всего лишь копия строки цифр над буквами. Это подтверждают коды виртуальных клавиш, отправленные при нажатии этих клавиш.Создание кодов на ноутбуке без них
Я пытаюсь разработать небольшую программу для имитации альт-кодов при нажатии клавиши alt и обычных чисел. Я использую низкоуровневый клавиатурный крючок (у меня есть аналогичный формат, работающий в другой программе), и сначала проверьте, не нажата ли либо Alt-клавиша. Если любой из них, я прокручиваю коды VK 0x30-0x39 (0-9 ключей). Если один из них нажат в этот момент, я отбрасываю фактическое нажатие клавиши, возвращая значение 1 и вместо этого отправляю версию с номером клавиатуры этого ключа (в этот момент все еще нажата кнопка 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
Я вижу, что вы подтвердили коды клавиш, но я все же должен спросить .. вы уверены, что у вас нет ключа numlock? часто на ноутбуках он находится в другом цвете, разделяя пространство с каким-то другим ключом, например вставкой или паузой или что-то еще. и вы активируете его, удерживая кнопку «fn» или что-то в этом роде. – davogotland
Я искал и искал. Я впервые заметил это, прежде чем купил его через комментарий другого покупателя. Asus G74SX-XA1, если вам интересно. – chris
ouch .. соболезнования – davogotland