2012-01-13 1 views
1

У моего ноутбука есть номерная панель, но у нее нет клавиши 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 
+0

Я вижу, что вы подтвердили коды клавиш, но я все же должен спросить .. вы уверены, что у вас нет ключа numlock? часто на ноутбуках он находится в другом цвете, разделяя пространство с каким-то другим ключом, например вставкой или паузой или что-то еще. и вы активируете его, удерживая кнопку «fn» или что-то в этом роде. – davogotland

+0

Я искал и искал. Я впервые заметил это, прежде чем купил его через комментарий другого покупателя. Asus G74SX-XA1, если вам интересно. – chris

+0

ouch .. соболезнования – davogotland

ответ

0

Ну, я, наконец, вернулся к этому и после еще некоторого тестирования я обнаружил, что программно отправка [ALT] [Num6] [num5] [ALT] делает ничего вообще. Я нахожу это странным, потому что я умею имитировать клавиши регулировки громкости на клавиатурах Mac, несмотря на отсутствие этих клавиш.

Поскольку компьютер просто не может отправлять альт-коды, я объявляю этот полезный инструмент по-королевски ввернутым, если я не начерчу тысячи символов.

EDIT:

Вот что вам нужно сделать, чтобы получить номер колодки работы G74SX-XA1:

  1. Скачать BIOS 203 (не если 202 работ или не знаю, Я пошел с 201 до 203 года).
  2. Поместите файл на флеш-накопитель в формате FAT32.
  3. Перезагрузите компьютер и нажмите F4, чтобы перейти в EasyFlash, или перейдите к нему через BIOS. Программа Winflash, которая поставляется с ней, не работает.
  4. Выберите обновленный файл BIOS на флеш-накопителе.
  5. Теперь индикатор numlock всегда будет включен, и числовая клавиатура будет иметь коды виртуальных клавиш цифровой клавиатуры, а не цифры над буквами. Это, естественно, включает в себя коды ALT.
Смежные вопросы