Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.01.09;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.034 c
1-1103742624
Capital
2004-12-22 22:10
2005.01.09
Своя область на контрол-панэл


14-1103313023
Vasya.ru
2004-12-17 22:50
2005.01.09
Пара вопросов к мастерам:


6-1098265522
Кирилл.
2004-10-20 13:45
2005.01.09
как через прокси пингануть ност?


3-1102609838
mefisto
2004-12-09 19:30
2005.01.09
Вставка в ячейку DBGrid ProgressBar !!!


1-1103581319
karachi
2004-12-21 01:21
2005.01.09
Не работает печать в QReport





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский