Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как эмулировать нажатие клавиш на клавиатуре для чужой программы [D7, Win2k, WinXP]


Страницы:   1 2 3

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.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо