Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Автозаполнение окна  (Прочитано 23644 раз)
0 Пользователей и 9 Гостей смотрят эту тему.
ВЮА
Гость
« : 09-10-2006 12:46 » 

Здравствуйте господа.

Подскажите с кагого бока подходить к проблеме. Есть окно стороннего приложения. В нем поле для ввода запроса, окно вывода результата и кнопка выполнения запроса ("Найти"). Запрос и ответ - обычные текстовые строки. Требуется программа, автоматически заполняющая поле запроса, "нажимающая" кнопку, и считывающая результат в текстовую переменную. Буду рад советам, или ссылкам на полезный материал.

Заранее благодарю.
Записан
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 09-10-2006 13:47 » 

Думаю так. Делаешь глобальный хук, для того, чтобы получить хендл окна и элементов управления. Как хендл получишь начинай слать сообщения. Текст задать можно еще и функциями GetText() SetText() вроде так назывались.
Записан

ещё один вопрос ...
nikedeforest
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 09-10-2006 13:50 » 

помню где-то там засада есть Улыбаюсь и кажется в районе посыла сообщения о  клике по кнопке.
Записан

ещё один вопрос ...
Джон
просто
Администратор

de
Offline 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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #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
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #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;
}

Спасибо всем кто помог.
Записан
Джон
просто
Администратор

de
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 12-10-2006 13:19 » 

Джон, ну как хук продумаешь так и будет. Тыкни мышкой на одном элементе, запомни его хендл, тыкни на втором - запомни его. ПРоблемы и нету как таковой.
Записан

ещё один вопрос ...
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #14 : 12-10-2006 13:40 » new

Хм... про "мышкой тыкать" никто и не говорил. Тогда и хук не нужен - есть очень простая ф-я
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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #15 : 12-10-2006 13:54 » 

о, функцию эту всегда забывал Улыбаюсь

А последние две строки не понял, в каком смысле автоматически? И о кких классах ты говрил?
Записан

ещё один вопрос ...
ВЮА
Гость
« Ответ #16 : 12-10-2006 13:59 » 

А основная проблема так и оcталась не решённой. Жаль

В смысле? 

Контролы заполняются автоматическм, програмно, результат считывается. Делай дальше с ним что хочеш.
К борланду отношения не имею, см. выше все в MS Visual Studio.

А, дошло.  Ну в моем случае все контролы разные, поэтому проблем нет Улыбаюсь
« Последнее редактирование: 12-10-2006 14:04 от ВЮА » Записан
Джон
просто
Администратор

de
Offline 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."
Джон
просто
Администратор

de
Offline 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 от ВЮА » Записан
Джон
просто
Администратор

de
Offline 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."
Джон
просто
Администратор

de
Offline 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 при каждом обнаружении кнопки.
Записан
Джон
просто
Администратор

de
Offline 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 » 

Да. В этом смысле просто повезло с расположением Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines