ВЮА
Гость
|
|
« : 09-10-2006 12:46 » |
|
Здравствуйте господа.
Подскажите с кагого бока подходить к проблеме. Есть окно стороннего приложения. В нем поле для ввода запроса, окно вывода результата и кнопка выполнения запроса ("Найти"). Запрос и ответ - обычные текстовые строки. Требуется программа, автоматически заполняющая поле запроса, "нажимающая" кнопку, и считывающая результат в текстовую переменную. Буду рад советам, или ссылкам на полезный материал.
Заранее благодарю.
|
|
|
Записан
|
|
|
|
nikedeforest
|
|
« Ответ #1 : 09-10-2006 13:47 » |
|
Думаю так. Делаешь глобальный хук, для того, чтобы получить хендл окна и элементов управления. Как хендл получишь начинай слать сообщения. Текст задать можно еще и функциями GetText() SetText() вроде так назывались.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
nikedeforest
|
|
« Ответ #2 : 09-10-2006 13:50 » |
|
помню где-то там засада есть и кажется в районе посыла сообщения о клике по кнопке.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #3 : 09-10-2006 14:01 » |
|
Проблема номер один заключается в том, как определить кто есть ху? Допустим у тебя на окне только 3 контрола: 2 едита + 1 кнопка, допустим ты получил три хендла, на как ты узнаешь что хэндл Nr1 это поле запроса, а не результата?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
ВЮА
Гость
|
|
« Ответ #4 : 09-10-2006 14:04 » |
|
Ок. Что такое "Хук", как его считать, и как определить имя или иказатель на элементы управления?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #5 : 09-10-2006 14:08 » |
|
Для разнообразия прочти эту тему: https://forum.shelek.ru/index.php/topic,5793.0.htmlКстати есть несколько вопросов: 1) Среда разработки? 2) Этот диалог твой или чужой программы?
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
ВЮА
Гость
|
|
« Ответ #6 : 09-10-2006 14:31 » |
|
1. Среда MSVC.NET 2. Программа чужая. (Ну как чужая, я ее купил, но хочу кое что автоматизировать).
|
|
|
Записан
|
|
|
|
ВЮА
Гость
|
|
« Ответ #7 : 10-10-2006 13:50 » |
|
Спасибо за ссылку, посмотрел. Теперь, если не сложно, подскажите как правильно послать сообщение, скажем елементу TEdit, если узвестен указатель на него? Мне нужно в поле ввести текст. Я так понимаю что SendMessage (указатель, ...,...,...)... а дальше?
|
|
« Последнее редактирование: 10-10-2006 13:51 от ВЮА »
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Online
Пол:
Пролетал мимо
|
|
« Ответ #8 : 10-10-2006 14:42 » |
|
Ну во первых не указатель, а Хэндл. Это чуть разные понятия, хотя практически с одним и тем же смыслом. Виндовс напрямую не работает с указателями на экземпляр объекта. Для этого применяют специальный индефикатор Handle, который уникален в данной системе и в данный момент и однозначно индефицирует объект (контрол). Чтобы выташить текст из контрола, применяют сообшение WM_GETTEXT. Чтобы положить текст в контрол, применяют сообшение WM_SETTEXT . Прыгни по ссылкам и почитай, инструкции по использованию. Для облегчения работы были сделаны функции-враперы GetWindowTextLength, GetWindowText и SetWindowText.
|
|
« Последнее редактирование: 10-10-2006 14:48 от Finch »
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
ВЮА
Гость
|
|
« Ответ #9 : 10-10-2006 23:31 » |
|
Спасибо, попробую.
|
|
|
Записан
|
|
|
|
ВЮА
Гость
|
|
« Ответ #10 : 11-10-2006 10:35 » |
|
Ок. Получилось. Теперь, если можно как выбрать нужную строку в выпадающем списке (TComboBox), нажать на кнопку (TButton) , и считать текст в окне RichEdit. Если не сложно, конечно.
|
|
|
Записан
|
|
|
|
ВЮА
Гость
|
|
« Ответ #11 : 12-10-2006 11:41 » |
|
Ура, Все получилось. В Итоге заработал следующий вариант: #include "stdafx.h" #include "Richedit.h"
void ReadRez (HWND hwd) //Считываем текст из ReachEdit { LRESULT lResult ; char buf [1024]; lResult = SendMessage (hwd, WM_GETTEXT, 512, (LPARAM)buf); buf [1023]=0; }
void SetCombo (HWND hwd) // Выставляем 6ую строку в СomboBox { LRESULT lResult ; lResult = SendMessage (hwd, CB_SETCURSEL, 6, 0); } void SetEdit (HWND hwd) // Заполняем Edit { LRESULT lResult ; char buf [25]; strcpy(buf,"Test"); lResult = SendMessage (hwd, WM_SETTEXT, 0, (LPARAM)buf); } void RunQuery (HWND hwd) // нажимаем кнопку { LRESULT lResult ; lResult = SendMessage (hwd, BM_CLICK, 0, 0); }
BOOL CALLBACK EnumChildProc( HWND hwnd, // handle to child window LPARAM lParam // application-defined value ) { char Buf[25]={0}; GetClassName(hwnd, Buf, 25); //Считываем тип контрола if (!strcmp(Buf,"TEdit")) { SetEdit(hwnd); } if (!strcmp(Buf,"TComboBox")) { SetCombo(hwnd); } if (!strcmp(Buf,"TRichEdit")) { ReadRez(hwnd); } if (!strcmp(Buf,"TButton")) { RunQuery(hwnd); } return true; }
int WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND MainWin = FindWindow(0,"MainWind"); // Ищем основное окно EnumChildWindows(MainWin, (WNDENUMPROC)EnumChildProc,0); //Запускаем поиск дочерних окон. return 1; } Спасибо всем кто помог.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #12 : 12-10-2006 13:06 » |
|
А основная проблема так и оcталась не решённой.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
nikedeforest
|
|
« Ответ #13 : 12-10-2006 13:19 » |
|
Джон, ну как хук продумаешь так и будет. Тыкни мышкой на одном элементе, запомни его хендл, тыкни на втором - запомни его. ПРоблемы и нету как таковой.
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #14 : 12-10-2006 13:40 » |
|
Хм... про "мышкой тыкать" никто и не говорил. Тогда и хук не нужен - есть очень простая ф-я HWND WindowFromPoint(POINT Point);
А вот автоматически... Ооопаньки.
И кстати - приведённый код будет работать только с борландовсикми экзешниками. В чистом API классы называются по другому.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
nikedeforest
|
|
« Ответ #15 : 12-10-2006 13:54 » |
|
о, функцию эту всегда забывал А последние две строки не понял, в каком смысле автоматически? И о кких классах ты говрил?
|
|
|
Записан
|
ещё один вопрос ...
|
|
|
ВЮА
Гость
|
|
« Ответ #16 : 12-10-2006 13:59 » |
|
А основная проблема так и оcталась не решённой. В смысле? Контролы заполняются автоматическм, програмно, результат считывается. Делай дальше с ним что хочеш. К борланду отношения не имею, см. выше все в MS Visual Studio. А, дошло. Ну в моем случае все контролы разные, поэтому проблем нет
|
|
« Последнее редактирование: 12-10-2006 14:04 от ВЮА »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #17 : 12-10-2006 14:12 » |
|
ВЮА Среда разработки тут не причём, я знаю, что ты работаешь в VS. Та прога с которой ты работаешь - сделана в Борланде - имена контролов начинаются с Т. Посмотри spy++ нормальные виндовс контроллы и ты увидишь, что они называются "Button" "Edit" и тд. Поэтому имеет смысл искать просто на эти строки в имени класса. Ну, а проблема очень проста, если, например, кнопка в z-order стоит на первом месте, то EnumChildProc сначала "нажмёт" на неё, а не обратится сначала к полю ввода, как того хотелось бы. Ну и тд. Те я хочу сказать, что необходима доп информация, чтобы определить какое окно какие ф-ции выполняет. На основании HANDLE этого не сделаешь. Скажем так, тебе повезло, что z-order совпал с твоим желанием, если всё работает. Но в самом общем случае задача не имеет решения.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #18 : 12-10-2006 14:21 » |
|
nikedeforest, сорри - твой пост не заметил. Итак ещё раз наглядно: Допустим есть окно с контролами
HWND1-input edit HWND2-result edit HWND3-action button HWND4-close button
Например нужно
ввести данные в 1 нажать 3 считать результат из 2 нажать 4
Но если z-order будет
HWND4-close button HWND1-input edit HWND2-result edit HWND3-action button
То EnumChildProc сначала найдёт HWND4 и нажмёт её.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
ВЮА
Гость
|
|
« Ответ #19 : 12-10-2006 14:23 » |
|
Нажимаем мы, а не EnumChildProc. Она находит. единственная проблема, действительно, заключается при наличии двух одинаковых контролов. Сходу думается только такой вариант: Поскольку порядок нахождения контролов строго определенный, достаточно определить каким по счету находится какой контрол, и, когда его номер выпадает, запускать соответствующую функцию. Естественно управляемое приложение нужно сначала изучить, на предмет порядка расположения контролов, и их названий. Так жеи процедуру поиска нужно запустить столько раз, сколько есть контролов. (возможно, в самом худшем случае, каждую процедуру придется разрабатыватьотдельно).
|
|
« Последнее редактирование: 12-10-2006 14:26 от ВЮА »
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #20 : 12-10-2006 15:06 » |
|
Нажимаем мы, а не EnumChildProc.
Да нет, вот тут ты ошибаешься - нажимает именно она. Она перебирает все подряд (z-order) и выполняет определённые действия на этими окнами - посылает им сообщения. В данном случае контролу типа Button будет отправлено сообщение BM_CLICK void RunQuery (HWND hwd) // нажимаем кнопку { LRESULT lResult ; lResult = SendMessage (hwd, BM_CLICK, 0, 0); }
(возможно, в самом худшем случае, каждую процедуру придется разрабатывать отдельно). Поэтому я и написал, что в самом общем случае задача не разрешима. НО! Единственное, что остаётся у контролов окна постоянным - это z-order. Те можно сделать небольшой сервис для пользователя. Сначала показать ему существующий порядок и позоволить выбрать самому очерёдность действий. А потом уже отрабатывать в этой очерёдности. Если же родительское окно имеет постоянные размеры и контролы не перемещаются, то тогда легче всего воспользоваться ф-ей WindowFromPoint. Сначала пользователь щёлкает необходимую для него последовательность окон (и выбирает для них необходимые действия). В массив заносятся только координаты, а потом всё выполняется в одном цикле, без EnumChildProc. Так например работают многие макросы.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #21 : 12-10-2006 15:11 » |
|
Насчёт "нажимаем" - мы наверное не поняли друг-друга. Я имел ввиду, что это происходит программно в EnumChildProc. А что ты имел ввиду, когда говорил "Нажимаем мы"?
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
ВЮА
Гость
|
|
« Ответ #22 : 12-10-2006 23:08 » |
|
Я имел в виду, что нажимает команда lResult = SendMessage (hwd, BM_CLICK, 0, 0);, а не EnumChildProc. Последняя - это функция поиска дочерних окон. А нажимать или не нажимать в этом цикле выбираем Мы. Ну в смысле нам не обязательно отправлять SendMessage при каждом обнаружении кнопки.
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #23 : 12-10-2006 23:18 » |
|
Ок, но в твоём примере это происходит. Те на лицо именно автоматизация без участия человеков, те нас - это то, что я имел ввиду.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
ВЮА
Гость
|
|
« Ответ #24 : 12-10-2006 23:20 » |
|
Да. В этом смысле просто повезло с расположением
|
|
|
Записан
|
|
|
|
|