Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.09;
Скачать: CL | DM;

Вниз

Управление чужим приложением   Найти похожие ветки 

 
snake1977   (2004-11-24 10:14) [0]

Здравствуйте!! подскажите пожалуйста. Я пытаюсь получить все элементы расположенные на форме чужого приложения, чтобы потом ими можно было управлять. Для этого делаю следующее
....
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 10:59) [1]

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

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;


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


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


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

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


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

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


 
Digitman ©   (2004-11-24 13:20) [4]


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


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

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


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

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

вот :)

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


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

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

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


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


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


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

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


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


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

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


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

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


 
Digitman ©   (2004-11-24 14:26) [9]


> snake1977   (24.11.04 14:20) [8]


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

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


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

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

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

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


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


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


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


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

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


 
Digitman ©   (2004-11-24 17:33) [13]

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

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



Страницы: 1 вся ветка

Текущий архив: 2005.01.09;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.022 c
3-1102478024
dolphin
2004-12-08 06:53
2005.01.09
ошибка по псевдониму или ... ???


1-1103824947
zokzok
2004-12-23 21:02
2005.01.09
Фреймы


9-1095050166
NikeOLD
2004-09-13 08:36
2005.01.09
Деформация 3D объектов


3-1102488885
AHTOH
2004-12-08 09:54
2005.01.09
Чайницкий вопрос про отображение и редактирование записей в IBX


4-1100872941
Змей
2004-11-19 17:02
2005.01.09
не прямоугольная форма