Страница 1 из 1
Автоматизация ввода с клавиатуры
Добавлено: 16 июн 2014, 12:36
Foster08
Возможно существуют готовые решения, буду благодарен за информацию.
Необходимо написать приложение которое будет перехватывать нажатие комбинации одной-двух заданных клавиш на клавиатуре.
После отжатие одной или обеих клавиш необходимо что бы приложение в ответ, кратковременно через указанный промежуток
времени сэмулировала нажатие другой комбинаций клавиш.
Пример: Пользователь зажал клавиши "A" и "S", далее он отпускает одну или обе зажатых клавиш - в ответ программа эмулирует
нажатие (с заданной продолжительностью) двух других клавиш "W" и "D".
Re: Автоматизация ввода с клавиатуры
Добавлено: 16 июн 2014, 13:09
somewhere
Key Remapper или другие программы подобного вида для переназначения клавиш. Тысячи их.
Re: Автоматизация ввода с клавиатуры
Добавлено: 16 июн 2014, 14:09
Romeo
Если нужно именно программное решение, то обрабатывать сообщения
WM_KEYDOWN и
WM_KEYUP и генерировать эти же сообщения с другими параметрами в зависимости от указанных условий.
Re: Автоматизация ввода с клавиатуры
Добавлено: 16 июн 2014, 15:02
Foster08
somewhere писал(а):Key Remapper или другие программы подобного вида для переназначения клавиш. Тысячи их.
Нужна такая, которая позволяла бы выполнять действие именно при отжатии одной или двух клавиш. Софт гуглил, но отвечающим моим казалось бы простым требованиям я так и не нашёл.
Romeo
Я так понимаю тут 2 выхода использовать api и C# либо же писать на чистом С++? В любом случае нужен будет делать HOOK на клавиатуру. Не могли бы Вы показать пару рабочих примеров?
Re: Автоматизация ввода с клавиатуры
Добавлено: 16 июн 2014, 15:29
Romeo
По моему опыту, хук нужен в том случае, когда требуется обработать хитрые нажатия в условиях не DefWinfowProc (то есть в не сапомисном окне), например в диалоговой форме, где в зависимости от фокуса, нажатия клавиатуары будут перехватываться дочерними элентами управления и сообщения не будут доходить до оконной процедуры самой формы. К тому же стандартной диалоговой процедурой будут перехватываться нажатия Tab, Shift-Tab, стрелки и другие нажатия для обеспечения навигации среди дочерних элементов управления. Действительно, в таком случае придётся воспользоваться API функией
SetWindowsHookEx, передав в качестве idHook значение WH_KEYBOARD. Дополнительно понять что да как поможем вот эта
статейка, на которую, впрочем, есть ссылка из основной статьи. Примера использования функции, к сожалению, под рукой нет, но если прочтёшь вышеуказанные статьи, то никах проблем с её использованием не возникнет.
Если же у нас случай полностью самописного окна, можно не возится с хуками, а воспользоваться обычной обработкой сообщений
WM_KEYDOWN и
WM_KEYUP.
Re: Автоматизация ввода с клавиатуры
Добавлено: 16 июн 2014, 16:07
somewhere
Как я понял, задача в том, чтобы одно приложение мониторило нажатия клавиш, которые передаются другому приложению и досылало ему же необходимые сочетания. Была у меня одна разработка для онлайн игры, там была реализована нестандартная камера, которая управлялась клавиатурой и мышью. Мое приложение мониторило нажатия клавиш, используя GetKeyState и перемещения мыши, используя DirectInput, - и меняло ячейки памяти в игре, соответствующие текущему углу обзора камеры. Иногда досылало WM_KEYDOWN и WM_KEYUP через SendMessage в окно игры. И все это работало без каких либо хуков. Вообще, надо стараться не использовать хуки в прикладных программах. Антивирусы на них очень подозрительно смотрят и "на всякий случай" могут отказать в загрузке такой DLL, а могут просто кричать на полэкрана о присутствии клавиатурного шпиона. GetKeyState + таймер имеет свои плюсы. Например, можно легко мониторить нажатия сразу нескольких клавиш, в то время, как механизм прерываний не даст такой точности. Отпускание двух клавиш с коротким интервалом времени (назовем это "одновременно") будет генерить только один WM_KEYUP, как это не печально. Соответственно для вашей программы другая клавиша останется нажатой. Аналогичная ситуация с WM_KEYDOWN. Это, кстати, главная причина, почему управление во многих аркадных играх делают не на основе событий клавиатуры, а на основе периодического опроса. В общем, есть над чем поразмышлять.
Re: Автоматизация ввода с клавиатуры
Добавлено: 17 июн 2014, 11:31
Romeo
Антивирусы орут, когда приложение ставит хук на чужое окно. Установка хука на окно, принадлежащее текущему приложение - достаточно обыденная вещь для всевозможных сабклассингов и довеса функциональности на готовые формы без изменения кода самих форм. Но то, что хуки нужно использовать как можно реже и лучше их не использовать вообще, если без них можно обойтись - в этом я солидарен на все сто. Использование хуков как минимум усложняет понимание кода, так как ты, анализируя код некой формы, не всегда ожидаешь такого подвоха, что где-то в другом файле, а возможно даже в другой dll твоего же приложения добавлен ещё один кусок функциональности, и для того, чтобы понять почему форма вдруг так себя повела, хотя кода отвечающего за это в соответствующем файле нету, возможно придётся потратить кучу ценного времени.
Re: Автоматизация ввода с клавиатуры
Добавлено: 18 июн 2014, 12:01
somewhere
Я говорил не про оконные, а про системные хуки. Что, в прочем, логично, т.к. нажатия клавиш в игре не будут передаваться в окно следящего приложения. Установить хук на окно игры - это более сложная задача, чем установить глобальный хук (WH_KEYBOARD кажется). И в том и в том случае придется иметь дело с антивирусом.
А про сложность понимания: разумеется. У меня даже есть общее правило - стараться не использовать те методы, которые не "прозрачные", т.е. те, что могут повести себя непредсказуемо и не наглядно. Такие методы сложны в дебаге. Те же хуки: требуется обход антивируса + непрозрачная работа + поведение меняется в зависимости от версии ОС и системных настроек.