![]() |
| ||
|
|
Новости |
Поиск |
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. Даже просто буквы и цифры не печатаются.
ANB (2005-05-13 09:04:00) [1]
> GrayFace © (12.05.05 19:55) [41]
- Magic не ест никакие, ни одиночные, ни печатные. Хотя накопал странную штуку - комбобокс в Magic на кнопки посланные WM_KEYDOWN+WM_KEYCHAR+WM_KEYUP реагирует. Но у него оконная процедура подписана subclassed и и класс - ComboBox, похоже стандартный виндовый. У остальных контролов - свои классы.
GrayFace (2005-05-12 19:55:00) [2]alpet © (05.05.05 14:09) [8]
Он ловит те что отправляются PostMessage и игнорирует сообщения проходящие мимо очереди (sended via SendMessage).
В очередь-то они попадают(идущие не от родного потока). Только Get/PeekMessage не возвращает управление циклу выборки сообщений, вызывая сразу оконную процедуру.
ANB © (05.05.05 17:05) [10]
Left ест, Ctrl + Left - не ест. Никак. Пробовал и по отдельности кнопки нажимать - отпускать и все вместе - не работает.
Значит одиночные все-таки ест? Тогда понятно. Наверняка используется GetKeyState(VK_CTRL). А Ctrl+Left работает, как Left или, вообще, не работает?
ANB © (06.05.05 8:59) [14]
> alpet © (05.05.05 20:29) [13]
не, не приходит.
А ты с Alt-ом жал?
ANB © (06.05.05 12:39) [21]
А где можно покопать насчет акселераторов ?
Справка: CreateAcceleratorTable. Еще можно посмотреть модуль Menus.
ANB (2005-05-12 09:35:00) [3]Посмотрел спаем. Адрес оконной процедуры эдита - $00428D75. И что это может значить ?
ANB (2005-05-11 16:57:00) [4]Да я уже всем окнам этого мэйджика в цикле эти сообщения отправлял. И главному и мди_клиенту и мди_чилду и всем кнопкам, всему, у чего хэндл нашел. Ноль эмоций. А на keybd_event реагирует. Причем, когда я спаем ловил сообщения, то он говорил, что сообщения послаются кнопке на форме (она класса Button и имеет хендл). Мне бы хотя бы чему нибудь и хоть одну клавишу запихать, чтобы сработало. Потом доделаю и остальное. Вот alpet дело говорит, но это я завтра смотреть буду.
Digitman (2005-05-11 16:47:00) [5]
> который вообще на форме картинкой лежит
значит, посылать соотв.сообщения нужно тому виз.окну, оконная ф-ция которого отвечает и за отрисовку грида и за пользовательский ввод
alpet (2005-05-11 16:43:00) [6]ANB © (11.05.05 16:39) [36]
> - надо попробовать. А с чем сравнить результат ?
Обычно с адресом библиотеки user32.dll, в принципе и так будет ясно - если адрес в hex будет больше $71000000 скорее всего он принадлежит одной из dll Windows.
ANB (2005-05-11 16:39:00) [7]
> Digitman © (11.05.05 16:29) [34]
- но если я сам их посылаю, то они полностью игнорятся. А EM_REPLACESEL я не могу посылать, так как вообще то мне нужно кнопки со стрелками иммитировать, и не для едита, а для грида, который вообще на форме картинкой лежит.
> alpet © (11.05.05 16:30) [35]
- надо попробовать. А с чем сравнить результат ?
alpet (2005-05-11 16:30:00) [8]ANB © (11.05.05 16:08) [31]
Эт просто - GetWindowLong (edit_hwnd, GWL_WNDPROC).
Я еще подумал что не вызывается TranslateMessage, и в таком случае не должны получатся WM_CHAR и WM_DEADCHAR, но тогда не работал бы и пользовательский ввод.
Digitman (2005-05-11 16:29:00) [9]
> ANB © (11.05.05 16:20) [33]
ну вот видишь !
интересующие тебя сообщения таки посылаются интересующему тебя контролу ...
ANB (2005-05-11 16:20:00) [10]Смотрел :
WM_KEYDOWN, WM_KEYCHAR, EM_SETSEL, EM_REPLACESEL, WM_KEYUP
Остальные я или опознаны или связаны с фокусом и движением мыши.
Digitman (2005-05-11 16:13:00) [11]
> Этот эдит - обычный WinControl с хэндлом и реагирует на
> все сообщения (мышь, замена текста, получение текста), кроме
> сообщений от клавиатуры
такого быть не может
ведь юзер как-то вводит текст в этот контрол ..
возьми spyxx.exe и проследи, какие сообщения получает конкретный интерисующий тебя эдит-контрол, будучи в фокусе, при клавиатурных событиях, инициируемых юзером
ANB (2005-05-11 16:08:00) [12]
> alpet © (11.05.05 16:07) [30]
- узнать бы еще это . . . Может подскажешь как ????
alpet (2005-05-11 16:07:00) [13]А у этого EDITa родная оконная процедура (в АП user32.dll)?
ANB (2005-05-11 16:04:00) [14]
> Digitman © (11.05.05 15:45) [28]
- да вот черт его знает, обычное или нет. Работает на платформе Win32. Первые версии писались еще под Win 3.11 в 1992 году. Писали израильтяне. Исходников нет. Описания ядра нет. Только руководство по программированию.
Поисследовал, и что узнал :
- форму проги рисуют в дизайнтайме как в VS.
- палитра маленькая, только ограниченный набор компонентов, свои вставлять нельзя, есть возможность вставить OLE, но она не работает.
- при создании формы она выглядит просто как картинка (принцип Java), но, например, если на форме 5 эдитов, то для одного из них (который в фокусе) создается едит своего класса. Этот эдит - обычный WinControl с хэндлом и реагирует на все сообщения (мышь, замена текста, получение текста), кроме сообщений от клавиатуры.
- работает, есно, в режиме интерпретатора.
Digitman (2005-05-11 15:45:00) [15]
> ANB © (11.05.05 15:34) [27]
странно это ...
это самое Magic - обычное Win32 GUI-приложение ?
тогда оно должно точно так же как и другие GUI-приложения реагировать сообщения клав.ввода
ANB (2005-05-11 15:34:00) [16]Дамс. Без Digitmana не разобраться.
alpet (2005-05-06 19:11:00) [17]Может сработает SetKeyboardState вместе с AttachThreadInput ? В MSDN это впрочем не оговаривается.
ANB (2005-05-06 16:27:00) [18]Да толку то. Ну выясню я, что юзает. Чтобы теперь подсунуть ему мои кнопки, мне все равно придется внедряться.
alpet (2005-05-06 16:10:00) [19]Что бы проверить, вызывается ли GetKeyState - не обязательно даже через API подключатся. Можно попробывать подключится к этому процессу отладчиком и поставить бряк. Срабатывание (или не срабатывание) его и поможет вывести процесс на чистую воду.
ANB (2005-05-06 14:35:00) [20]Проверил я флажки. Все задано, и скэнкод и количество повторений. А Magic автоматически закрывает свои окна, если переходишь в другой режим. Если он юзает GetKeyState, то чем внедрятся, мне проще оставить keybd_event.