![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как эмулировать нажатие клавиш на клавиатуре для чужой программы [D7, Win2k, WinXP]
ANB © (2005-05-04 18:04:00)Пытаюсь эмулировать нажатие клавиш для программ написанных на Magic (вряд ли кто слышал). Программы пишут наши проги, а исходников оболочки нет. Работает как интерпретатор. Столкнулся с проблемой : не могу эмулировать по человечески нажатие клавиш. Для делфовых приложений сделал через WM_KEYDOWN, WM_KEYUP и WM_CHAR. Все работает. А для Magic смог эмулировать только через keybd_event. Это плохо, так как при работе нельзя будет переключатся в другие программы.
Кто подскажет, куда рыть при разбирательстве ? Какими хитрым способом этот д..й Magic может обрабатывать сообщения клавиатуры ? Мышь он по человечески обрабатывает.
Я пробовал посылать WM_KEYDOWN, WM_KEYUP и WM_CHAR и главному окну и MDI Child и едитам - эффекта 0. Даже просто буквы и цифры не печатаются.
alpet (2005-05-06 13:31:00) [21]> Тут мне наши высказали идею, что Magic все кнопки на акселераторы повесил, потому и не получается их иммитировать, как обычно.
Это было бы очень странно, даже не правильно. Он бы ловил нажатия всех клавиш в всех открытых окнах, что есть не порядок.
Тебе все же стоит сделать API hook и посмотреть пользуется ли он Get(Async)KeyState. Еще: если ты симулируешь нажатия с помощью WM_KEYDOWN (UP), внимательнее присмотрись к параметру lParam - в нем задаются дополнительные флажки.
ANB (2005-05-06 12:39:00) [22]
> это отладка приложения в момент эмитации если
- во во. Я пока отлаживал рекордер - задрался. Хорошо, в DLL фильтров наставил, чтобы он на мою прогу не реагировал.
> WM_HOTKEY
- не приходили. А где можно покопать насчет акселераторов ? Может через них что получится. Тут мне наши высказали идею, что Magic все кнопки на акселераторы повесил, потому и не получается их иммитировать, как обычно.
alpet (2005-05-06 12:32:00) [23]Насчет акселераторов: WM_HOTKEY проходит сообщение ?
xShadow (2005-05-06 11:57:00) [24]
> ANB © (06.05.05 11:01) [18]
Так ведь можно перед эмитацией переключиться на требуемое окно. По крайней мере делал так, для дубовых приложений.
Хотя в этом методе если большой минус, это отладка приложения в момент эмитации если, что не так будет и хук не снимется система подвиснет.
ANB (2005-05-06 11:01:00) [25]Статью в RSDN я уже читал, когда надо было рекордер писать. Вообще то мне wh_JournalRecord не подошел - он для клавы окно не присылал. Мне то нужно управлять окнами конкретного процесса, который я сам и запускаю.
ANB (2005-05-06 10:56:00) [26]Э, мне не надо, чтобы они отдыхали. Своим то приложением я должен управлять. И другими, кроме тестируемого. Плюс для wh_JournalPlayback нужно спецом готовить записи . . . Хотя может это и выход. Можно сделать 2 ветки, одну нормальную, другую для "кривых" приложений через wh_JournalPlayback (если он поможет, но, чувствую, вряд ли)
xShadow (2005-05-06 10:00:00) [27]Пока установлен хук все остальные мышиные и клавиатурные события отдыхают. На http://delphiworld.narod.ru/есть пример его правда нужно переделать малость
xShadow (2005-05-06 09:42:00) [28]
> - wh_JournalPlayback - чем он лучше keybd_event ?
http://www.firststeps.ru/mfc/winapi/hook/r.php?11
http://www.rsdn.ru/article/baseserv/winhooks.xml#ELBA
ANB (2005-05-06 08:59:00) [29]
> alpet © (05.05.05 20:29) [13]
не, не приходит.
> xShadow © (05.05.05 17:18) [12]
- wh_JournalPlayback - чем он лучше keybd_event ?
alpet (2005-05-05 20:29:00) [30]WM_SYSKEYDOWN не приходит ?
xShadow (2005-05-05 17:18:00) [31]А если попробовать хук wh_JournalPlayback и вставлять сообщения в очередь?
ANB (2005-05-05 17:12:00) [32]В spy включил просмотр событий клавиатуры - приходят только KEYDOWN, KEYUP. Больше ничего.
ANB (2005-05-05 17:05:00) [33]Left ест, Ctrl + Left - не ест. Никак. Пробовал и по отдельности кнопки нажимать - отпускать и все вместе - не работает.
ANB (2005-05-05 17:01:00) [34]Я пока сделал через keybd_event и оставил старый вариант под параметром. Кажется, начинаю въезжать, в чем проблема. Например TOAD есть буквы, но сочетания (Shift+Ctrl+F, F1) съел только через keybd_event. Чего то я не досылаю . . . Мне тут один гуру подсказал, что проблема в акселераторах. Надо покопатся.
alpet (2005-05-05 14:09:00) [35]Он ловит те что отправляются PostMessage и игнорирует сообщения проходящие мимо очереди (sended via SendMessage).
WH_GETMESSAGE
Installs a hook procedure that monitors messages posted to a message queue.
...
The system calls this function whenever the GetMessage or PeekMessage function has retrieved a message from an application message queue.
ANB (2005-05-05 13:02:00) [36]Хм. Хук WH_GETMESSAGE вообще не ловит мои сообщения . . .
ANB (2005-05-05 12:50:00) [37]Ну, в обработчике хука клавиатуры у меня вряд ли что получится. Как я там разберу - надо или не надо жать кнопки. По моему WH_GETMESSAGE лучше проканает.
Я так и сделал - но, если я двигаю мышей или жму кнопки на клаве - все сообщения хук ловит. А если посылаю сообщение сам - нет. Причем не только мое, вообще никакие. Хендл, вроде правильный.
alpet (2005-05-05 10:50:00) [38]> А как нибудь проверить alpet © (04.05.05 18:09) [1] можно ?
В обработчике хука клавиатуры устанавливай состояние клавиш указанным способом. Если программа не будет реагировать - этот способ не подходит.
ANB (2005-05-05 10:45:00) [39]Мрак. Похоже, проще будет таки плюнуть на моргания и перейти на keybd_event. :((( Имхо, так проще будет и начальство уже добро дало.
А как нибудь проверить alpet © (04.05.05 18:09) [1]можно ?
alpet (2005-05-05 10:06:00) [40]ANB © (05.05.05 09:24) [2]
> А как определить момент, что он уже вытащил клавишу через GetKeyState и можно записывать следующую ?
Поставить API hook на эту функцию, а так же на GetKeyboardState и GetAsyncKeyState.