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

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

Управление чужим приложением


snake1977 ©   (2004-11-24 10:14:00) 

Здравствуйте!! подскажите пожалуйста. Я пытаюсь получить все элементы расположенные на форме чужого приложения, чтобы потом ими можно было управлять. Для этого делаю следующее
....
EnumChildWindows(FindWindow(0,'Delphi'), @EnumChildProc, Longint(ListBox2.Items));
....

function EnumChildProc(Wnd: hWnd; SL: TStrings): BOOL; stdcall;
var
 szFull: array[0..255] of Char;
 szClass: array[0..255] of Char;
begin
 Result := Wnd <> 0;
 if Result then
 begin
   GetWindowText(Wnd, szFull, SizeOf(szFull));
   if (SL.IndexOfObject(TObject(Wnd)) < 0) then
     Begin
      GetClassName(wnd,szClass,SizeOf(szClass));
      Sl.AddObject(Trim(StrPas(szFull))+'/'+Trim(StrPas(szClass)),TObject(Wnd));
     end;
   EnumChildWindows(Wnd, @EnumChildProc, Longint(SL));
 end;
end;

в итоге получаю постой список :((
почему???


Digitman   (2004-11-24 17:33:00) [1]

ну да ладно ..
ну нахреначил ты в список ЭДИТов некую кучу целевых ЭДИТов ...

ну ОТ НАС-то что требуется ?!
все ж контролы, интересующие тебя,- налицо ... хэндлы оных ты поимел ...


snake1977   (2004-11-24 16:56:00) [2]

я сделал програмку, которая вызывает EnumWindows и заносит все найденное в список,
по выбранному из списка заголовку, я выбираю EnumChildWindows при выборе каждого я узнаю его GetWindowText и GetClassName и заполняю в список через строка/название_класса
вот таким макаром я узнал что там есть
/Edit
/Edit
/Edit
&Next >/Button
Finish/Button
.....


Digitman   (2004-11-24 16:39:00) [3]


> приложение представляет из себя визарда, где надо ввести
> ФИО в соответсвующие EDIT и нажать на кнопочку NEXT


давай так - на основании чего ты убежден, что видимые тобой на экране этого Визарда контролы, якобы предст.собой СТАНДАРТНЫЕ контролы, именно таковыми и являются ? ты проводил некие исследования ? какими средсьтвами ? что они показали ?


snake1977   (2004-11-24 14:32:00) [4]

>>Digitman
приложение представляет из себя визарда, где надо ввести
ФИО в соответсвующие EDIT и нажать на кнопочку NEXT
изначально эти три EDIT пусты, поэтому когда я строю список контролов то у меня получается список в котором есть тока имя класса

вот я хочу на автомате внести туда ФИО нажать на NEXT и т.д.
соответсвенно как мне внести Фамилию именно в тот EDIT куда надо.

просто методом тыка определить какой он по счету???
или как??


Digitman   (2004-11-24 14:26:00) [5]


> snake1977   (24.11.04 14:20) [8]


сначала определись, что ты ищешь.

ты же сам говоришь, что содержимое этих 3-х EDITов тебе заведомо неизвестно ...
так что же ты ищешь ? N-ный по счету (слева направо, к примеру, так как это выглядит сугубо визуально) EDIT ? или что ?


snake1977   (2004-11-24 14:20:00) [6]

С окнами все понятно (главное что работает поиск нормально)
и на кнопочку нажимается. осталась одна проблемма
в окошке есть три EDIT  ни у одного из них нет
строки возвращаемой GetWindowText, т.е. значение = ''
название класса у всех одинаково :(
как мне искать тогда функцией FindWindowEx ??
ведь у этих элементов нет названия а имя класса совпадает


Digitman   (2004-11-24 13:55:00) [7]


> который написан на кнопочке на панели задач


мало ли чего на этой кнопочке написано ..
тебе разве эта кнопочка нужна ? тебе нужно некое окно, в дан.случае имеющее заголовок "Delphi 5 - Project1 [Running]"

а эта самая кнопочка самостоятельного окна не имеет, не ищи ее.


> как быть если у элемента окна нет заголовка


мало того - "элемент" этот может и не иметь самостоятельного окна, поэтому что бы ни было написано на нем, окна ты не найдешь, ибо его просто нет - граф.изображение "элемента" попросту отрисовано на HDC того контрола, к которому "принадлежит" этот "элемент".

еще раз - не всякая "кнопка" является кнопкой в твоем понимании. т.е. не все что выглядит как "кнопка" имеет собственное окно.


snake1977   (2004-11-24 13:27:00) [8]

и еще вопрос если не сложно будет ответить
я посылаю кнопке сообщение
таким способом
h2 := FindWindowEx(wnd, 0, 0, '&Next >');
SendMessage(h2, BM_CLICK, 0, 0);

а как быть если у элемента окна нет заголовка
например это панель
или кнопка из toolbar ??


snake1977   (2004-11-24 13:23:00) [9]

я имел ввиду что в одном случае возвращается
caption (назовите как хотите :) ) который написан на кнопочке на панели задач
а во втором случае заголовок окна :)
т.е. на панели задач висит кнопка на которой написано Delphi
а окошко реально называется Delphi 5 - Project1 [Running]

вот :)

почему так я честное слово не понял


Digitman   (2004-11-24 13:20:00) [10]


> Caption приложения


у Win32-приложения нет никакого Caption.
Caption может быть у окна, но не у приложения.

"приложение" <> "окно"


snake1977   (2004-11-24 13:15:00) [11]

Получилось!!!
оказвается функции
у GetWindow(Handle, gw_HWndFirst) по возвращаемому хендлу, функция GetWindowText возвращает Caption приложения
а ежели выбирать список окон через EnumWindows, то по возвращаемому хендлу, функция GetWindowText возвращает Сaption окна
во как!


Leonid Troyanovsky   (2004-11-24 11:41:00) [12]


> snake1977   (24.11.04 10:14)  
> Здравствуйте!! подскажите пожалуйста. Я пытаюсь получить
> все элементы расположенные на форме чужого приложения, чтобы


http://groups.google.com/groups?selm=3CC15216.450FBAA8%40eco-pro.ru

--
С уважением, LVT.


Digitman   (2004-11-24 10:59:00) [13]

что-то ты намудрил ...

var
hTopLevelWnd: THandle;
..

//ищем род.окно в предположении что оно top-level
hTopLevelWnd := FindWindow(0,'Delphi');
//если найдено
if hTopLevelWnd <> 0 then
//запускаем енумерацию его доч.окон
EnumChildWindows(hTopLevelWnd, @EnumChildProc, Longint(ListBox2.Items));
....

//ф-ция енумерации (при возврате всякий раз истины) будет вызвана столько раз,
//сколько реально существующих доч.окон у окна с хэндлом hTopLevelWnd

function EnumChildProc(Wnd: hWnd; SL: TStrings): BOOL; stdcall;
var
szFull: array[0..255] of Char;
szClass: array[0..255] of Char;
begin
//Wnd не может быть нулевым !
 try
//получили нуль-терм. строку с именем окна (обрезка не требуется)
  GetWindowText(Wnd, szFull, SizeOf(szFull));
//получили нуль-терм. строку с именем класса окна (обрезка так же не требуется)
  GetClassName(wnd,szClass,SizeOf(szClass));
//добавили в стринг-лист полученную инф-цию
  Sl.AddObject(StrPas(szFull))+'/'+StrPas(szClass),TObject(Wnd));
//вернули истину для продолжения енумерации
  Result := True;
 except
//возникло какое-то исключение - вернули ложь для прекращения енумерации
  Result := False;
 end;
end;


Наверх

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