Как зажать кнопку на клавиатуре программой

Доброго времени суток, Геймдев!
Я столкнулся с проблемой адаптации управления джойстиком к одной игре, и прошу вашего совета.
Эмулятор клавиатуры для джойстика, который я использовал ранее — 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 в поле «На клавишу или комбинацию».

Читайте также:
Программа считывать QR код на Андроид

В конечном итоге окно будет выглядеть так:

Для добавления этого действия нажмите «ОК».

Теперь добавьте в папку последнее действие — нажатие комбинации 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru