![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Манипуляция в чужом приложении. [D7, 2003]
cosinus © (2009-02-25 10:31:00)Есть некое чужое приложение, которое я стартую из своей программы. После ввода логина и пароля (тоже програмно), стартует его главное окно, в котором есть т.н. "основное меню", т.е. "Файл", "Правка" (для примера по аналогии с IE) и т.д...
Задача
Мне необходимо открыть определенный пункт в этом меню.
Что делал.
1) Пытался "втупую" послать главной формеVK_F10и дальше пошлепали по менюVK_RIGHT,VK_RIGHT, VK_RIGHT, VK_DOWNи т.д.
пример:
sendmessage(MainHND, WM_KEYDOWN, VK_RIGHT, 0);
sendmessage(MainHND, WM_KEYUP, VK_RIGHT, 0);
Результат: F10 шлется, то есть я вижу, как "утапливается" первый пункт меню, и все, на стрелки не реагирует, хотя нажимая ручками в этот момент стрелки(после програмного F10), все работает.
2) Подумал слать не главной форме стрелки, а этому меню. После F10 делаю GetFocus, получаю нужный handle и шлю уже ему. Результат аналогичный.
3) Решил поступить еще более тупее )))GetRectглавного окна, далееSetCursorPosс нужным смещением по X и Y и
sendmessage(MenuHND, WM_LBUTTONDOWN, MK_LBUTTON, 0);
sendmessage(MenuHND, WM_LBUTTONUP, MK_LBUTTON, 0);
Тут правда наверно накосячил, неправильно это... Ну в общем тоже не работат. Курсор как будто никуда не перемещается, я могу им елозить по экрану, сколько душе вздумается, но в момент клика в любом месте, он как раз и перемещается, куда ему надо.
Чувствую, что много ошибок и все делаю не так, поэтому и спрашиваю здесь. Подскажите, как мне реализовать мою задачу.
cosinus (2009-02-26 15:01:00) [1]
> Юрий Зотов © (26.02.09 12:40) [7]
Спасибо, PostMessage помогло.
Юрий Зотов (2009-02-26 12:40:00) [2]1. PostMessage вместо SendMessage.
2. Цикл, ожидающий появления диалога.
3. Программное нажатие ОК.
cosinus (2009-02-26 12:30:00) [3]
> Leonid Troyanovsky © (25.02.09 18:47) [5]
Спасибо, действительно помогло.
Но по ходу родился еще вопрос.
Когда я выбираю нужный мне пункт меню (програмно или нет, это не критично), идет проверка лицензионности программы. Вибираю пока так...
SendMessage(i,WM_COMMAND,MakeWParam(WParam(ListBox1.Items.Objects[18]), 0),0);
Так вот, проверка идет около 1 секунды, а потом появляется окошко с кнопочкой "ОК", означающее, что все нормально, поверку все прошло. Пока я не нажму руками на ОК, мояпрограмма (sender) висит. Такое ощущение, что ответ на WM_COMMAND от программы-ресивера приходит только после нажатия на эту кнопку. Вопрос. Как мне програмно нажать на кнопку Ок, если я не могу сдвинуться в программе с места появления этой кнопки, пока ручками не нажму ОК? В общем замкнутый круг.
Потоки не спасут отца русской демократии?
Leonid Troyanovsky (2009-02-25 18:47:00) [4]
> cosinus (25.02.09 10:59) [3]
> Записал параметры, а после перезапуска все данные изменились
> (((
Сомневаюсь, что парметры, скажем, WM_COMMAND меняются от
запуска к запуску, обычно они зашиты, хотя бы, в ресурс.
Посмотри, например
http://groups.google.com/group/fido7.ru.delphi/msg/925bebee0309bec9
--
Regards, LVT.
cosinus (2009-02-25 16:41:00) [5]Проблемма так и не решилась (((
Может хоть что-нибудь подскажите, в какую сторону копать?
cosinus (2009-02-25 10:59:00) [6]О, еще ловил сообщения, как раз думал отловить ID-шники...
Поймал только вот эти...
WM_ENTERMENULOOP
WM_INITMENU
WM_MENUSELECT
Записал параметры, а после перезапуска все данные изменились (((
Оно похоже динамически создается.
Вот собственно в связи с этим, если вы не против, еще 2 вопроса вдогонку...
1) Можно ли как то отловить (не ставя хуки) динамически создаваемое меню?
2) Почему ни одна из программ а-ля Spy++ "не видит" его?
cosinus (2009-02-25 10:48:00) [7]Пробовал через Winspector, но он показывал только 2 компонента формы, а именно саму форму
TMainFormи MDIMDIClient. Сейчас проверил - spy++ показывает тоже самое.
clickmaker (2009-02-25 10:37:00) [8]можно вычислить (через spy++ или winsight), какие ID у пунктов меню и слать уже WM_COMMAND