Добрый день. Есть программа, которая обрабатывает ввод с клавиатуры с использованием directinput8. Необходимо эмулировать нажатия. С этим справляется SendInput, однако он требует, что бы окно целевого приложения было активно. Какие есть способы обойти это ограничение? Может быть можно что-то пропатчить в памяти что бы SendInput не делал эту проверку (если, конечно, она в юзерлевеле)? Или же единственный способ хукать функции directinput-а? Так же я пытался найти обработчик ввода внутри программы, но потерпел неудачу из-за отсутствия навыков реверсинга.
Решил перехватывать DI благо нашелся код делающий то, что нужно (http://www.wasm.ru/forum/viewtopic.php?id=38207). Однако столкнулся с проблемой - брекпойнт в xGetDeviceState() как на зло не срабатывает, хотя прога инициализирует DI (вызываются xDirectInput8Create и xCreateDevice). Означает ли это, что прога не использует DI для чтения клавиатуры? Либо есть другой способ читать данные не используя GetDeviceState()? Так же обнаружил, что прога юзает GetRawInputData(), хукнул ее и подставил свой код кнопки (raw->data.keyboard.VKey == 'w') однако это опять таки не привело к видимому результату... Что же прога может юзать для получения ввода с клавиатуры?
Обнаружил, что прога импортирует GetKeyboardState(), было обрадовался, а нет, оказалось не оно. Похоже что создатели собрали все способы получения данных клавиатуры, но что используют на самом деле - вот загадка...
Вряд ли, потому как с GetRawInputData() я не совсем прав оказался. После ее хука перестал работать шифт(я сначала не заметил). Программа - это игра, на шифте было прицеливание, однако на WASD это никакого влияния не оказало, сл-но их они получают каким-то другим способом. Хотя в упор не понимаю зачем так делать.
DirectInput точно не при делах, поставил в отладчике бряки на Acquire/Unacquire - не срабатывают, при том что на CreateDevice срабатывает несколько раз. Наверно просто забыли убрать инициализацию...
дык оно тоже передает фокус ввода, насколько я понимаю. а что-то вводить с фокусом проблемы нет - я инъекчу dll и вызываю SendInput(). тока вот оно перестает работать, когда фокус пропадает. на самом деле, нашлось грубое решение, выяснилось что vmware поддерживает directx, причем игры идут достаточно шустро. буду юзать его.
пока смысла нет - удовлетворительное решение нашлось. да и мне самому интересно найти ответ как они достают кнопки, потом как нибудь еще поковыряюсь.
Dreamer_other Я за 3%4 дня отбиваю полностью драва или аверские вм. Но не найти как кейстат чекается это ппц. Чтоб меня разорвало!
рад за тебя, что ты такой опытный. однако я не профессиональный реверсер и приступил к этой задаче имея лишь базовые знания winapi из рихтера прочитанного сто лет назад, мне простительно тупить ) ну и если есть какие-то очевидные вещи, которые я не замечаю, вполне можно было бы подсказать - форум для этого и предназначен.
Dreamer_other Что вам подсказать. Кейстат получается несколькими сервисами, вы сказали что все из проверили. Далее значит чекается не реальный кейстат, а системная очередь сообщений, тут стопяцот методов. Какой из них юзает ваше приложение я знать не могу, кофейная гуща тоже почему то не знает, наверно не так кофе сварил.. Да и вообще в виньапи тока нубы лезут, нормально в юзермодах сие решается через apfnDispatch[]. В ядре захват RIT. Остальное от лукавого. Перечислять шадова хуки етц это полнейший изврат и гемор.