Доброго времени суток, Геймдев!
Я столкнулся с проблемой адаптации управления джойстиком к одной игре, и прошу вашего совета.
Эмулятор клавиатуры для джойстика, который я использовал ранее — JoyToKey, имел существенный недостаток — там не было возможности эмулировать «зажатие» клавишы (не многократное нажатие, а именно зажатие). Таким образом, даже отправляя до 30 эмуляций нажатии на клавишу в секунду, игра обрабатывала их все отдельно, и вместо слитного движения персонажа, получались много маленьких рывков.
Я попробовал составить собственный маленький пример эмуляции нажатия клавишы с помощью WinAPI-шного SendInput. Там, если помните, есть флаг, происходит ли событие «нажатия» или «отжатия» указанной клавиши. Таким образом, я надеялся, что отправив событие «нажатия» клавиши, но не отправляя события «отжатия» клавиши, я введу её в состояние «зажатости» — но, как вы догадались, ничего из этого не вышло, клавиша отжималась самостоятельно.
Эмитируем зажим кнопки W с помощью AutoHotkey
Мне думается, что Windows сам периодично опрашивает состояние кнопок клавиатуры, тем самым возвращая эмуляционно «зажатую» кнопку в исходное состояние.
Итого, вот мой вопрос: как же мне создать эмуляцию полноценного зажатия кнопки? Или хотя бы, в какую сторону следует копать?
#1
23:30, 5 янв 2011
То есть даже при использовании sendInput клавиша каким-то образом «отжимается»? Это проверенно или догадки? Может дело не в том, что ты пишешь а в обработке клавиш принимающей программой?
#2
11:31, 6 янв 2011
Я проверил работу SendInput, написав маленький пример (в C++ Builder), отправляющий нажатие клавиши VK_TAB. Если бы она осталась зажатой, то фокус должен был прыгать между контролами, которые я разместил на форме. Однако по отправке SendInput фокус смещается всего 1 раз, аналогично одному нажатию на TAB
#3
11:51, 6 янв 2011
Ты наверно не понимаешь что такое «зажатая» клавиша. На самом деле когда ты держишь её нажатой приходит целая куча нажатий и ни одного отпускания.
#4
12:12, 6 янв 2011
Longinus
> Если бы она осталась зажатой, то фокус должен был прыгать между контролами,
> которые я разместил на форме. Однако по отправке SendInput фокус смещается
> всего 1 раз, аналогично одному нажатию на TAB
Не, когда ты зажимаешь TAB фокус прыгает потому что срабатывает автоповтор нажатия и постоянно приходят сообщения keydown.
#5
21:29, 6 янв 2011
Sergio
> Ты наверно не понимаешь что такое «зажатая» клавиша. На самом деле когда ты
> держишь её нажатой приходит целая куча нажатий и ни одного отпускания.
Теперь всё встаёт на свои места!
В самом деле, попробовал сейчас цикличный SendInput нажатия кнопки с интервалом в 50мс — игра обработала его как настоящую «зажатость» 🙂
Видимо, проблема эмулятора JoyToKey в том, что даже в режиме отправки многократных нажатий за клик, каждую отдельное нажатие сопровождалось и сигналом отпускания кнопки..
Теперь дело за малым — дописать эмулятор. Спасибо за подсказку!
Источник: gamedev.ru
Key Manager
Key Manager — это более функциональный вариант программы Key Remapper, которая, кроме переназначения клавиш и кнопок мыши, содержит множество других полезных функций.
Например, Key Manager позволяет переназначать комбинации клавиш и кнопок мыши, последовательности нажатий, долгое нажатие (нажатие и удержание). Переназначать клавиши в зависимости от раскладки клавиатуры. Позволяет представлять действия в виде всплывающих меню, которые можно открывать по горячим клавишам; выполнять, записывать и редактировать макросы нажатий (последовательности нажатий); впечатывать или вставлять текст (в том числе форматированный), мгновенно заполнять формы сайтов; запускать программы и открывать сайты (в параметрах адреса которых можно указать текущий выделенный текст); менять раскладку и регистр выделенного текста; управлять питанием монитора, компьютера; регулировать громкость и устанавливать определенный уровень; выполнять действия над окнами (перемещение, установка конкретного размера) и многое другое.
Key Manager — открывает новые возможности клавиатуры и мыши, позволяя значительно сэкономить время и силы при работе за компьютером. Благодаря гибкому интерфейсу возможно создавать различные действия и выполнять их по нажатию горячих клавиш, кнопок мыши или комбинаций, а также представлять их в виде всплывающего меню. Кроме этого программа имеет мощные средства по переопределению клавиш и кнопок мыши и их блокировке. Переопределение и работу действий можно ограничить или разрешить только в определенных программах и/или окнах.
Key Manager позволяет назначить на обычное, длительное (нажатие и удержание) и последовательное нажатие клавиш, кнопок мыши, прокрутку колеса и комбинации с клавишами модификаторами, а также всплывающее меню следующие действия:
- Отображение всплывающего меню с другими определенными Вами действиями.
- Вставку определенного Вами текста в обычном или RTF формате в любую программу с возможностью вставлять текущие дату, время, текущий выделенный текст и другие данные на основе шаблонов.
- Нажатие и блокировку клавиш, комбинаций клавиш, нажатие кнопок и осуществление прокрутки колеса мыши.
- Запись и выполнение макросов нажатий клавиш и кнопок мыши с возможностью задавать задержки между нажатиями.
- Выполнять клики, позиционировать и смещать указатель мыши относительно всего экрана, активного окна и предыдущей позиции, с возможностью возвращать указатель в изначальное положение после выполнения действия. Подробнее смотрите во втором видео ниже.
- Запуск любой программы или открытие файла или папки (для создания достаточно просто перетащить ярлык, папку или файл в окно действия).
- Открытие определенной Вами веб-страницы с возможностью использования в адресе текстовых шаблонов, которые позволяют получить и подставить текущий выделенный текст, содержимое буфера обмена и многое другое.
- Мгновенное создание электронного письма с возможностью использования шаблонов.
- Выполнение действий над всеми окнами или над активным (закрыть, свернуть, развернуть на весь экран, восстановить, скрыть, показать, перерисовать, переместить, изменить размер).
- Управление питанием компьютера, питанием монитора, управление звуком компьютера, запуск хранителя экрана и многое другое.
Также в программе есть возможность представить практически любую клавишу или кнопку мыши как пользовательский модификатор и использовать (подобно Alt и Ctrl) в комбинации с другими клавишами, кнопками мыши и модификаторами.
Снимки экрана
Видеопримеры
Переназначение комбинаций клавиш
Пример замены комбинаций Ctrl + Insert (Копировать), Shift + Insert (Вставить), Shift + Delete (Вырезать) и Alt + Backspace (Отменить) в устаревшей программе Borland Turbo C++ на стандартные Ctrl + C, Ctrl + V, Ctrl + X и Ctrl + Z соответственно. Также созданные комбинации отображаются в виде всплывающего меню по нажатию комбинации Ctrl + «Правая кнопка мыши» и определяется исключение, чтобы заданные комбинации клавиш работали только в указанной программе.
Эмуляция кликов мыши в разных программах по горячим клавишам
Видео показывает возможность Key Manager позиционировать и смещать (с кликом) указатель мыши относительно активного окна и предыдущей позиции с возможностью возвращать указатель в изначальное положение после выполнения действия.
Вставка определенного пользователем форматированного текста (RTF) в MS Word и другие текстовые редакторы
В примере демонстрируется вставка форматированного RTF текста, который содержит текущую дату, в программу MS Word. Также показана замена выделенного текста на этот же текст, но окружённый скобками.
Открытие любого выделенного текста в интернет браузере
В примере демонстрируется применение действия «Открытие веб-страницы» и шаблона %km_seltext (выделенный текст).
Эмуляция двойного клика левой кнопки мыши
В примере на клавишу F1 назначается двойной клик левой кнопки мыши и на F2 — двойной клик с задержкой 600 мс.
Запись набираемого текста и последующая его вставка (макрос)
Пример записи нажатий клавиш и последующее их нажатие (воспроизведение) по нажатию комбинации Win + 5.
Вставка текста из буфера обмена в программы, не поддерживающие буфер обмена
На клавишу Ctrl + V назначается действие впечатать текст, которое, с применением шаблона %km_cbtext, впечатывает текстовое содержимое буфера обмена.
Как пользоваться программой
Установка программы
Для установки программы скачайте установочный дистрибутив и запустите на установку.
Работа с программой
После установки запустите программу. На экране появится главное окно:
В верхней части этого окна находится панель для работы с профилями, а также кнопки «Пауза» и «Настройки программы»:
Ниже этой панели находится окно, посредством которого осуществляется добавление новых действий и папок, и управление ими.
Для добавления нового действия необходимо кликнуть на строку «(кликните, чтобы добавить)»:
Появится окно, показанное на рисунке:
Большинство действий имеют имя, которое отображается в поле «Имя действия». По умолчанию оно формируется автоматически на основе данных действия.
Поcле добавления, новое действие появляется в древовидном списке главного окна:
Поскольку добавленное в примере действие-папка имеет назначенную комбинацию клавиш LCtrl+LShift+1, оно не только позволяет структурировать все имеющиеся действия, но и позволяет представить содержащиеся в нем действия в виде всплывающего меню.
Для демонстрации этого добавим в вышеуказанное действие-папку три действия. Первое будет вставлять текст, второе запускать программу, а третье заменять долгое нажатие клавиши CapsLock на комбинацию клавиш Ctrl+C (в Windows этой комбинации соответствует команда — «копировать в буфер обмена»).
Для этого кликните по строке «(кликните, чтобы добавить)», которая находится внутри папки:
Выберите в появившемся окне действие «Вставка текста». Далее в поле «Вставляемый текст» напишите какой-нибудь текст, например: «Текст написан:», за которыми следуют текущая дата и время. Чтобы использовать дату и время, необходимо вставить шаблон. Для этого нужно кликнуть кнопку , и в появившемся меню выбрать требуемый вид даты и времени. Вы можете редактировать шаблоны самостоятельно, основываясь на имеющихся примерах. Конечный вид вставляемого сообщения отображается в поле «Предпросмотр»:
При работе с этим действием его имя формируется автоматически. Если Вы хотите определить свое имя для действия — впишите его самостоятельно в поле «Имя действия».
Для добавления действия нажмите «ОК».
Теперь добавьте в папку второе действие. Снова кликните по строке в папке «(кликните, чтобы добавить)» и выберите в списке действие «Запуск программы или файла».
В данном примере будет осуществляется запуск программы MS Word. Для того чтобы указать на программу MS Word, можно кликнуть кнопку «Файл…» и указать исполняемый файл. Это также можно сделать проще, просто перетащив мышью на окно свойств действия ярлык из меню «Пуск» или исполняемый файл из папки требуемой программы, например «C:Program Files».
Также назначим запуск этого действия на нажатие комбинации клавиш Ctrl+2 в поле «На клавишу или комбинацию».
В конечном итоге окно будет выглядеть так:
Для добавления этого действия нажмите «ОК».
Теперь добавьте в папку последнее действие — нажатие комбинации Ctrl+С, а также назначте его на длительное нажатие (нажатие и удерживание) клавиши CapsLock.
Для этого снова кликните внутри папки на строку «(кликните, чтобы добавить)» и выберите в списке действие «Клавиша или комбинация».
Кликните мышью в поле «Клавиша или комбинация» и нажмите комбинацию клавиш Ctrl+C.
Напишите в поле «Имя действия» — текст «Копировать».
Кликните в поле «На клавишу или комбинацию» и нажмите клавишу CapsLock и поставьте флажок «Долгое нажатие».
По окончанию окно будет выглядеть так:
Для добавления этого действия нажмите «ОК».
Главное окно в конечном виде будет выглядеть так:
Теперь попробуем, как это работает. Убедитесь, что программа не стоит на паузе и нажмите комбинацию клавиш LCtrl+2 — запустится программа MS Word.
В программе MS Word нажмите комбинацию клавиш LCtrl+LShift+1 — появится меню:
Выберите в меню первый пункт «Текст написан…» — произойдет вставка текста:
Допишите что-нибудь к вставленному тексту, выделите весь текст и нажмите и удерживайте некоторое время клавишу Caps Lock — произойдет внутреннее нажатие комбинации клавиш Ctrl+C — копирование текста в буфер обмена. Выберите в меню программы MS Word — «Правка» -> «Вставить» — вставится текст, скопированный в буфер обмена.
Для тренировки Вы можете назначить на обычное нажатие клавиши CapsLock — нажатие комбинации клавиш Ctrl+V (вставить текст), назвав действие «Вставить», тем самым Вы сможете пользоваться буфером обмена, нажимая всего одну клавишу CapsLock. Для копирования — долгое нажатие, для вставки — обычное.
Если Вам требуется изначальная клавиша CapsLock, Вы можете назначить нажатие этой клавиши на другую клавишу или комбинацию, например на Ctrl+CapsLock или Ctrl+Shift+Tab:
Управление действиями и горячие клавиши
Созданные папки и действия Вы можете легко перемещать и копировать (удерживая клавишу Ctrl при перемещении).
Добавлять, изменять и удалять действия и папки Вы можете с помощью контекстного меню или используя следующие горячие клавиши:
Ctrl+P | Включить/Отключить паузу |
Insert | Вставить действие |
Shift+Insert | Вставить папку/меню |
Enter | Добавить/Изменить папку или действие в зависимости от контекста |
Delete | Удалить папку или действие |
Ctrl+Delete | Удалить все папки и действия (очистить текущий профиль) |
Ctrl+C | Копировать действие или папку |
Ctrl+X | Вырезать действие или папку |
Ctrl+V | Вставить действие или папку |
Ctrl+Shift+C | Копировать весь профиль как папку |
пробной версии программы можно создавать не более 20 действий и 10 папок/меню. Программой допустимо свободно пользоваться в течении 30 дней.
Для снятия всех ограничений, необходимо ее купить. После покупки Вам на электронный адрес будет отправлено сообщение, содержащее данные для регистрации, которые необходимо ввести в программе, через пункт меню «Регистрация».
Источник: atnsoft.ru
Как имитировать зажатие кнопки на клавиатуре c++?
Я уже многое перепробовал и всё это работает не так, как надо, на пример:
PostMessage(hWnd, WM_KEYDOWN, BYTE(‘A’), 0); Sleep(time); PostMessage(hWnd, WM_KEYUP, BYTE(‘A’), 0);
keybd_event(vk, 0, 0, 0); Sleep(time); keybd_event(vk, 0, KEYEVENTF_KEYUP, 0);
Хотя это работает:
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); Sleep(time); mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
Ещё пробовал SendIpnput, но не уверен что правильно.
Всё это не зажимается, а нажимается(либо единожды, либо дважды), но как именно ЗАЖАТЬ кнопку?
Помогите пожалуйста. Буду крайне благодарен!
- Вопрос задан более года назад
- 313 просмотров
Источник: qna.habr.com