Перейти к содержанию
    

Аппаратный эмулятор клавиатуры и мыши

Там ещё есть вспомогательная программв WinSpy для выяснения идентификаторов элементов окна которые предполагается нажимать (вроде через посылку сообщений)

 

P.S. Есть ещё AutoKey (AutoHotkey) подобная программа.

AutoHotkey я использовал.

 

Чтобы вы понимали, я написал свою программу для нажатия клавиш. Перечисляю список доступных методов:

keybd_event, SetKeyboardState, SendInput, SendInput со сканкодом (Кстати работает там где мне нужно, но клавишу нажимает только 1 раз и не отпускает. С флагами всё нормально. в нормальных программах всё как надо отпускает.), PostKeyEx32, PostKeyExHWND, а так же прямое обращение к порту клавиатуры (нужно чтобы со старта компьютера была воткнута PS/2 клава) и поддержку девайса usb2kbd.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы вы понимали, я написал свою программу для нажатия клавиш. Перечисляю список доступных методов:

keybd_event, SetKeyboardState, SendInput, SendInput со сканкодом (Кстати работает там где мне нужно, но клавишу нажимает только 1 раз и не отпускает.

Посмотрел свои исходники - я использовал SendInput.

 

Можно попросить вас залить куда-нибудь вашу прогу? Если не жалко, то с исходниками, но и бинарник очень пригодится проверить на особо капризных программах.

Сам писал прогу, ставил хук на WH_JOURNALRECORD, но у меня получалось только заменять нажатые клавиши, или делать чтобы клавиша не нажималась.

Я уже почти мало что помню (10 лет!), но WH_JOURNALRECORD вроде позволяет работать с системной очередью сообщений клавиатуры? Это мало подходит.

А SendInput (с предварительным BlockInput, чтобы случайно символы от настоящей клавы не влезли) - то что нужно.

Хотя я вначале тоже что-то пытался делать с WH_JOURNALRECORD.

 

Помню общий алгоритм: ищем в системе окно имеющее клавиатурный фокус; внедряемся в него через хук; из этого хука (от имени приложения имеющего фокус клавиатуры) переключаем клавиатурный фокус на нужное нам окно (куда будем симулить нажатия); симулим нажатия (SendInput); возвращаем клавиатурный фокус на место. Примерно так.

Выкладываю мою библиотеку с исходником: https://yadi.sk/d/3Lkc6-D3rRcJu

Этот проект у меня недоделан, так что там много отладочных вставок. Но код работает - эта библиотека используется моей утилитой, которая принимает нажатия кнопок ИК-пульта и обрабатывает их согласно скриптам, управляет различными другими внешними приложениями (в основном видео-плеерами разными, AcdSee, WinAmp, DScaler и т.п.). Некоторые из этих приложений могут управляться только мышкой или с клавиатуры (не нашёл WM_... которыми можно ими управлять), для таких случаев и написал эту библиотеку. Пока с какими только приложениями не пробовал за прошедшие годы - работает со всеми нормально, внедряется и эмулит кнопки.

Касательно кода - комментов нет; '///' в коде - обозначает отладочную вставку.

Приложение-клиент библиотеки, грузит её, затем вызывает StartSimulate() передавая ей (насколько помню) дескриптор окна, куда надо симулировать нажатия (целевое окно). Дальше, когда надо вызвать симуляцию последовательности нажатий, вызывает SimulateKbd(). При завершении клиента, надо вызвать StopSimulate().

Вот фрагмент кода клиента, вызывающего SimulateKbd():

void TIPCALL SimulateKbdClient(HWND hw, const char *str)
{
 static const struct {
   char *name;
   uchar code;
 } vk[] = {{"LBUTTON", VK_LBUTTON}, {"RBUTTON", VK_RBUTTON},
   {"MBUTTON", VK_MBUTTON}, {"CANCEL", VK_CANCEL}, {"BACK", VK_BACK},
   {"TAB", VK_TAB}, {"CLEAR", VK_CLEAR}, {"ENTER", VK_RETURN},
   {"SHIFT", VK_SHIFT}, {"LSHIFT", VK_LSHIFT}, {"RSHIFT", VK_RSHIFT},
   {"CTRL", VK_CONTROL}, {"LCTRL", VK_LCONTROL}, {"RCTRL", VK_RCONTROL},
   {"ALT", VK_MENU}, {"LALT", VK_LMENU}, {"RALT", VK_RMENU},
   {"PAUSE", VK_PAUSE}, {"CAPITAL", VK_CAPITAL}, {"ESC", VK_ESCAPE},
   {"SPACE", VK_SPACE}, {"PGUP", VK_PRIOR}, {"PGDN", VK_NEXT},
   {"END", VK_END}, {"HOME", VK_HOME}, {"LEFT", VK_LEFT}, {"UP", VK_UP},
   {"RIGHT", VK_RIGHT}, {"DOWN", VK_DOWN}, {"SELECT", VK_SELECT},
   {"PRINT", VK_PRINT}, {"EXECUTE", VK_EXECUTE}, {"SNAPSHOT", VK_SNAPSHOT},
   {"INS", VK_INSERT}, {"DEL", VK_DELETE}, {"HELP", VK_HELP},
   {"LWIN", VK_LWIN}, {"RWIN", VK_RWIN}, {"APPS", VK_APPS},
   {"SLEEP", VK_SLEEP},
   {"NUMPAD0", VK_NUMPAD0}, {"NUMPAD1", VK_NUMPAD1},
   {"NUMPAD2", VK_NUMPAD2}, {"NUMPAD3", VK_NUMPAD3},
   {"NUMPAD4", VK_NUMPAD4}, {"NUMPAD5", VK_NUMPAD5},
   {"NUMPAD6", VK_NUMPAD6}, {"NUMPAD7", VK_NUMPAD7},
   {"NUMPAD8", VK_NUMPAD8}, {"NUMPAD9", VK_NUMPAD9},
   {"MULTIPLY", VK_MULTIPLY}, {"ADD", VK_ADD},
   {"SEPARATOR", VK_SEPARATOR}, {"SUBTRACT", VK_SUBTRACT},
   {"DECIMAL", VK_DECIMAL}, {"DIVIDE", VK_DIVIDE},
   {"F1", VK_F1}, {"F2", VK_F2}, {"F3", VK_F3}, {"F4", VK_F4},
   {"F5", VK_F5}, {"F6", VK_F6}, {"F7", VK_F7}, {"F8", VK_F8},
   {"F9", VK_F9}, {"F10", VK_F10}, {"F11", VK_F11}, {"F12", VK_F12},
   {"NUMLOCK", VK_NUMLOCK}, {"SCROLL", VK_SCROLL},
   {"BROWSER_BACK", VK_BROWSER_BACK},
   {"BROWSER_FORWARD", VK_BROWSER_FORWARD},
   {"BROWSER_REFRESH", VK_BROWSER_REFRESH},
   {"BROWSER_STOP", VK_BROWSER_STOP},
   {"BROWSER_SEARCH", VK_BROWSER_SEARCH},
   {"BROWSER_FAVORITES", VK_BROWSER_FAVORITES},
   {"BROWSER_HOME", VK_BROWSER_HOME},
   {"VOLUME_MUTE", VK_VOLUME_MUTE},
   {"VOLUME_DOWN", VK_VOLUME_DOWN},
   {"VOLUME_UP", VK_VOLUME_UP},
   {"MEDIA_NEXT_TRACK", VK_MEDIA_NEXT_TRACK},
   {"MEDIA_PREV_TRACK", VK_MEDIA_PREV_TRACK},
   {"MEDIA_STOP", VK_MEDIA_STOP},
   {"MEDIA_PLAY_PAUSE", VK_MEDIA_PLAY_PAUSE},
   {"LAUNCH_MAIL", VK_LAUNCH_MAIL},
   {"LAUNCH_MEDIA_SELECT", VK_LAUNCH_MEDIA_SELECT},
   {"LAUNCH_APP1", VK_LAUNCH_APP1},
   {"LAUNCH_APP2", VK_LAUNCH_APP2},
   {"OEM_1", VK_OEM_1},
   {"OEM_PLUS", VK_OEM_PLUS},
   {"OEM_COMMA", VK_OEM_COMMA},
   {"OEM_MINUS", VK_OEM_MINUS},
   {"OEM_PERIOD", VK_OEM_PERIOD},
   {"OEM_2", VK_OEM_2},
   {"OEM_3", VK_OEM_3},
   {"OEM_4", VK_OEM_4},
   {"OEM_5", VK_OEM_5},
   {"OEM_6", VK_OEM_6},
   {"OEM_7", VK_OEM_7},
   {"OEM_8", VK_OEM_8}};

 short *p, mk[256];
 char b[256];
 int i, c, n;

 if (!str) return;
 if (strlen(str) >= sizeof(B)) return;
 strupr(strcpy(b, str));
 str = b;
 for (i = 0; c = *(str = Ltrim(str)); ) {
   if (c == '+' || c == '-') str++;
   else c = 0;
   if (i >= ncell(mk) - 2 || !*str) return;
   *(p = &mk[i++]) = 0;
   if (c == '-') *p = 256;
   if (!c) i++;
   if ((n = strpbrk(str + 1, " +-") - str) < 0) n = strlen(str);
   c = *(uchar *)str;
   if (n > 1) {
     c = ncell(vk);
     do if (!strncmp(vk[--c].name, str, n)) {
       c = vk[c].code;
       break;
     } while ©;
   }
   if (!c) return;
   *p |= c;
   p[1] = c | 256;
   str += n;
 }
 mk[i] = 0;
 if (simulateKbd) simulateKbd(hw, mk);
}

где: simulateKbd - указатель, полученный:

bool (WINAPI * simulateKbd)(HWND, short *) = simulateKbd = (bool (WINAPI *)(HWND, short *))GetProcAddress(hMyLib, "SimulateKbd");

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрел свои исходники - я использовал SendInput.

...

 

Посмотрел исходники. К сожалению ваша библиотека предназначена совсем для других целей и ничем мне не поможет.

 

Там создаётся окно, которое принимает клавиши с пульта, для того чтобы перевести коды пульта в клавиши и перенаправить в нужное окно. А так, по сути, там обычный SendInput.

 

У меня же проблема в другом - Окно не хочет принимать никакие сэмулированные комманды. Примеры - игры Quake 3, Axiom Verge, Runers.

Изменено пользователем Anatoly88

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Окно не хочет принимать никакие сэмулированные комманды. Примеры - игры Quake 3, Axiom Verge, Runers.

Как-то хотел прикрутить аналоговый джойстик к БФ-2, оно тоже меня игнорировало.

Но я видел программку , что симулировала клавиатуру от джойстика и управляла этой игрой, но джойстик становился цифровым.

Так что программная возможность имеется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так что программная возможность имеется.

Раньше с некоторыми мышками разработчики поставляли отдельные программы (наверное взаимодействующие с драйвером мышки от производителя)

для переопределения "клавиш" и не только мыша, и были вроде отдельные для этого программы.

(узнал об этом когда купил мышку работающую через IRDA интерфейс, скорость работы мыша через IRDA для игр, конечно. оставляла желать лучшего)

 

P.S. Эти простые варианты работали в ХP, и возможно под вопросом их текущая работоспособность в рамках Win7, хотя подобные решения, наверняка,

есть и на текущем уровне "развития" средств ввода/вывода в компьютер и может в виде открытых драйверов. :)

Изменено пользователем Kopa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Раньше с некоторыми мышками разработчики поставляли отдельные программы (наверное взаимодействующие с драйвером мышки от производителя)

для переопределения "клавиш" и не только мыша, и были вроде отдельные для этого программы.

У меня сейчас такая мышь - A4Tech X7 XL-750BK. Там на три кнопки можно поставить практически всё что угодно, через специальную программу. Кстати, макросы там прошиваются прямо в саму мышь, так что не совсем программное решение получается.

 

Пока что программно у меня заработаль только через SetPort, но там свой геморой - нужно иметь подключеную PS/2 клавиатуру и оно конфликтует с обычной клавиатурой.

 

Как-то хотел прикрутить аналоговый джойстик к БФ-2, оно тоже меня игнорировало.

Так-то поддержка джойстика, и возможность эмуляции клавиш - две большие разницы. Программа просто отлавливала нажатия на джойстике, и переводила их в приемлимый для игры вид.

Изменено пользователем Anatoly88

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня сейчас такая мышь - A4Tech X7 XL-750BK. Там на три кнопки можно поставить практически всё что угодно, через специальную программу. Кстати, макросы там прошиваются прямо в саму мышь, так что не совсем программное решение получается.

Обычно с отладочными платами где есть контроллер со встроенным USB (в данном случае даже без Host возможностей) производитель приводит готовые примеры

реализации мышинных и клавиатурных интерфейсов. Выбрать можно из разного семейства контроллеров и допилить программу под себя.

 

P.S. Навскидку, например, с OLIMEXINO-32U4

встречал также описание мышек в таком аппаратном решении, но цена уже какая то несоизмеримая с использованным "железом" :)

На китайских площадках нужное "железо" ещё дешевле, наверное, можно найти. 4.9$

Есть в сети и такие проекты https://sites.google.com/site/mmjoyproject/o-proekte (игровой комбай на Arduino Pro Micro на ATmega32U4)

8789b4.jpg

Изменено пользователем Kopa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне бы хотелось аналог usb2kbd, улучшенный и с исправленными недостатками. А по большому счёту,главная проблема usb2kbd решается подменой бинда клавиши на несуществующую рабочую (Например F24), и установки скрипта на реальную клавишу с использованием несуществующей.

Изменено пользователем Anatoly88

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне бы хотелось аналог usb2kbd, улучшенный и с исправленными недостатками. А по большому счёту,главная проблема usb2kbd решается подменой бинда клавиши на несуществующую рабочую (Например F24), и установки скрипта на реальную клавишу с использованием несуществующей.

Тогда проще найти железо и проекты на STM32 по ключевым словам "stm32 usb keyboard" может и на местном форуме кто то подобое наверное делал.

что то подобное https://github.com/eddyem/stm32samples/tree..._mouse_keyboard

 

P.S. А использование USB необходимо? Спектр решений может быть более разнообразный.

Изменено пользователем Kopa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тогда проще найти железо и проекты на STM32 по ключевым словам "stm32 usb keyboard" может и на местном форуме кто то подобое наверное делал.

что то подобное https://github.com/eddyem/stm32samples/tree..._mouse_keyboard

 

P.S. А использование USB необходимо? Спектр решений может быть более разнообразный.

Дело в том что я данной теме совсем не разбираюсь, и по вашей ссылке ничего не пойму (Умею писать на Pascal\Delphi и читать с++ как сказку на ночь) (Keycodes почитал, не понял зачем константы там определяются, это вроде прошивка, нет?).

 

А какие аналоги USB могут быть? PS/2 потихоньку отходит в небытие, COM и LPT давно уже устарели, Firewire мертворождён. Разьве что для PCI что-то придумать, но думаю там и сложность совсем другая и цены другие.

Изменено пользователем Anatoly88

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какие аналоги USB могут быть? PS/2 потихоньку отходит в небытие, COM и LPT давно уже устарели, Firewire мертворождён. Разьве что для PCI что-то придумать, но думаю там и сложность совсем другая и цены другие.

PS/2 vможно использовать через соответствующие аппаратные переходники на USB.

USB-COM переходники распространены очень широко и встроены в Arduino платы на AVR зачастую.

И COM клавиатуры и мышки поддерживаются ещё Win7 при включении соответствующей опции в настройках.

 

P.S. Для клавиатуры можно подцепить свой контроллер к линиям встроенного в любую клавиатуру контроллера и эмулировать электрически нажатие клавиш.

(контролируя процесс сканирования нужных клавиш, например по прерываниям и перестраивая прерывания на требуемые линии портов контроллера)

Для мышки тоже может быть какое то подобное решение. :)

По реализации CDC HID клавиатуры и мыши не подскажу т.к. этим вопросом ещё не интересовался.

Если есть навыки программирования, то и другие языки и платформы не так страшны, у меня так вообще приоритет использования Форт (Forth) языка :)

Для контроллеров есть и Паскаль компиляторы.

Изменено пользователем Kopa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PS/2 vможно использовать через соответствующие аппаратные переходники на USB.

USB-COM переходники распространены очень широко и встроены в Arduino платы на AVR зачастую.

И Com клавиатуры и мышки поддерживаются ещё Win7 при включении соответствующей опции в настройках.

 

P.S. Для клавиатуры можно подцепить свой контроллер к линиям встроенного в любую клавиатуру контроллера и эмулировать электрически нажатие клавиш.

Для мышки тоже может быть какое то подобное решение. :)

По реализации CDC HID клавиатуры и мыши не подскажу т.к. этим вопросом ещё не интересовался.

Если есть навыки программирования, то и другие языки и платформы не так страшны, у меня так вообще приоритет использования Форт (Forth) языка :)

Про PS/2 и COM всё это как-то колхозно звучит. Про эмуляцию COM на USB вообще слышал много плохого. Знакомый подключал через COM шахматные табло, так они через переходник вообще не работали, им нормальный COM подавай. Да и скорость там оставляет желать лучшего. Помню как на Siemens SL45i заливал 1 mp3 по 50 минут. Хотя может сейчас научились делать переходники получше. Еще знаю что PS/2 разный для клавиатуры и мыши (Сейчас обычно совмещенный, если вообще есть.). Переходники с PS\2 на USB использовать не приходилось, а вот наоборот - да. Вот они четко разграничиваются на мышь и клаву.

 

Про эмулировать электричекси, это я так понял разбомбить клавиатуру, и её переделать под эмулятор? Теоретически будет работать, но могут возникнуть конфликты с самой клавиатурой. Ради интереса попробуй подключи 2 USB клавиатуры и нажми одновременно одинаковые клавиши, или разные. Я тестировал, эффект был разный в разных приложениях. Приведу пример - Держим на одной клавиатуре клавишу А, при этом на другой часто её нажимаем. Возникает задержка несколько секунд, потом нажатия проходят, так сказать, оптом.

Изменено пользователем Anatoly88

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про PS/2 и COM всё это как-то колхозно звучит.

Ну так, @"Вам шашечки или ехать" :) Это наиболее простые решения.

PS/2 может и не так интересно, но COM через USB вполне выглядит нормальным.(но да скорость может всё заморозить, но наверное не данном случае)

 

P.S. От одновременного нажатия клавиш аппаратно легко защитится.

Изменено пользователем Kopa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну так, @"Вам шашечки или ехать" :) Это наиболее простые решения.

PS/2 может и не так интересно, но COM через USB вполне выглядит нормальным.

А разьве есть принципиальная разница для какого порта разрабатывать? Мне впринципе всё равно как оно сделано, если будет соответствовать требованиям. А переходник можно и прям внутрь напаять.

Изменено пользователем Anatoly88

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А разьве есть принципиальная разница для какого порта разрабатывать? Мне впринципе всё равно как оно сделано, если будет соответствовать требованиям. А переходник можно и прям внутрь напаять.

Да почти никакой, если не брать во внимание что USB желательно иметь в контроллере аппаратный (а то раньше умудрялись и программно USB 1.1 делать V-USB)

но и не забыть про "проблему двух клавиатур".

 

P.S. Есть у меня тоже некоторые мысли по использованию чего то подобного в связке с контроллером, если сподвигнусь делать.

И да, речь не шла про эмуляцию USB. COM-USB выпускаемеые серийно мкросхемы (FTDI и др.)

 

Переходники с PS\2 на USB использовать не приходилось,

Это самый простой был переходник, если USB клавиатура поддерживала оба стандарта PS/2 и USB :)

 

Изменено пользователем Kopa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...