| 
| 
 | Вопрос # 3 956/ вопрос открыт / | 
 |  Здравствуйте!
 Пмомгите решить проблему.
 Я ищу окно
 FindWindow(nil, 'Caption');
 Нахожу. И вот как мне теперь перебрать элементы на этом окне?
 Т.е. определить кто есть Edit, кто BUtton и соответственно, либо вписать текст, либо нажать кнопку.
 И вообще, возможно ли это. Если да, то как?
 
 Заранее спасибо!
 
|  |   Вопрос задал: Muratov Radik (статус: Посетитель)Вопрос отправлен: 31 марта 2010, 16:13
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 23; последнее сообщение — 2 апреля 2010, 15:43; участников в обсуждении: 4. Страницы: [1] [2] [Следующая »]  
|   | Вадим К (статус: Академик), 31 марта 2010, 16:24 [#1]:пользуйтесь GetClassName. А там уже по имени видно. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 31 марта 2010, 16:37 [#2]:Чтобы перебрать дочерние оконные элементы, юзай функцию EnumChildWindows(). Чтобы определить класс дочернего элемента, пригодится функция GetClassName(), как выше написал Вадим К. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Паровоз (статус: 10-ый класс), 31 марта 2010, 19:18 [#3]:Странная постановка задачи. Обычно в конкретном приложении нужно найти конкретный элемент. А у Вас просто нужно найти все и затем сделать все, что можно сделать. |  
|   | Muratov Radik (статус: Посетитель), 1 апреля 2010, 09:15 [#4]:Подскажите где ошибка. Процедура находит не только элементы в нужном мне окне, но и меняет Caption у всех открытых приложений в системе. 
 function EnumChildWnd(h: HWND): BOOL; stdcall;
implementation
 
{$R *.dfm}
 
function EnumChildWnd(h: HWND): BOOL; stdcall;
begin
 SendMessage(h, WM_SETTEXT, 0,lparam(LPCTSTR('New caption')));
 Result := true;
end;
//
procedure TForm1.Button1Click(Sender: TObject);
var
 han: HWND;
begin
 
 han := FindWindow(0, 'My Test App');
 if han <> 0 then
  begin
 
   while true do
    begin
     EnumChildWindows(han, @EnumChildWnd, 0);
     Sleep(100);
    end;
  end;
end; |  
|   | Паровоз (статус: 10-ый класс), 1 апреля 2010, 12:56 [#5]:Вообще то Ваша программа должна виснуть потому что находится в бесконечном цикле. Нужно заменить 
 while true do
  begin
    EnumChildWindows(han, @EnumChildWnd, 0);
    Sleep(100);
  end;просто на
 EnumChildWindows(han, @EnumChildWnd, 0);так как EnumChildWindows сама организует цикл по всем дочерним окнам |  
|   | Muratov Radik (статус: Посетитель), 1 апреля 2010, 13:11 [#6]:Спасибо. Помогло. А как называется сообщение, чтобы кнопка нажалась? И вообще где можно посмотреть все виндовые сообщения? На сайте msdn нашел, но почему-то там не все
   |  
|   | Вадим К (статус: Академик), 1 апреля 2010, 13:18 [#7]:Не все?  а Вы помните их всех, раз делаете такой вывод?  
 Вообще то можно открыть файл messages.pas - там точно весь список, которые делфи знает.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | min@y™ (статус: Доктор наук), 1 апреля 2010, 13:20 [#8]: Цитата (Muratov Radik): А как называется сообщение, чтобы кнопка нажалась? BM_CLICK.
 An application sends a BM_CLICK message to simulate the user clicking a button. This message causes the button to receive a WM_LBUTTONDOWN and a WM_LBUTTONUP message, and the button's parent window to receive a BN_CLICKED notification message.
 
 Цитата (Muratov Radik): На сайте msdn нашел, но почему-то там не все   Вероятно, хреново искал.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 1 апреля 2010, 13:38 [#9]:Ну BM_CLICK на сайте мсдн и не найдешь   Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Muratov Radik (статус: Посетитель), 1 апреля 2010, 13:42 [#10]:Я извиняюсь за глупые вопросы, но: 1) SendMessage(h, BM_CLICK, 0 , 0) не работает;
 2) где узнать какие параметры(lparam, wparam) нужно передавать/принимать при посылке того или иного сообщения?
 на сайте в описании SendMessage написано
 wParam [in]
 WPARAM
 
 Specifies additional message-specific information.
 lParam [in]
 LPARAM
 
 Specifies additional message-specific information.
 и все
 |  
|   | Вадим К (статус: Академик), 1 апреля 2010, 13:53 [#11]:BM_CLICK будет работать только внутри приложения. Это "внутренне сообщение". 
 Какие передавать параметры? надо смотреть для каждого сообщения отдельно.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Muratov Radik (статус: Посетитель), 1 апреля 2010, 14:02 [#12]:А как же тогда нажать кнопку в другом приложении? |  
|   | Паровоз (статус: 10-ый класс), 1 апреля 2010, 14:05 [#13]:"SendMessage(h, BM_CLICK, 0 , 0) не работает" 
 Совсем не обязательно, чтобы чужое приложение обрабатывало BM_CLICK. Оно, например, может реагировать только на пару сообщений WM_LBUTTONDOWN WM_LBUTTONUP
 |  
|   | Muratov Radik (статус: Посетитель), 2 апреля 2010, 14:27 [#14]:Появился еще один вопрос. Я нахожу нужную мне кнопку 
 procedure TForm1.Button3Click(Sender: TObject);
var
 wnd, cwnd: HWND;
begin
wnd := FindWindow(nil, 'My test app');//получаем хендл главного окна
cwnd := FindWindowEx(wnd, 0, 0, 'Button1');// получаем хендл кнопки 
SendMessage(cwnd, WM_LBUTTONDOWN, 0, 0);// далее жмем
SendMessage(cwnd, WM_LBUTTONUP, 0, 0);
end;и все работает. Но если название кнопки больше 8 символов, то не работает. Не находит такую кнопку. В чем может быть дело? Может сталкивались с таким?
 |  
|   | Вадим К (статус: Академик), 2 апреля 2010, 14:31 [#15]:возвращает нулевой хендл? попробуйте сразу после вызова FindWindowEx вставить
 ShowMessage('код ошибки = '+ IntToStr(GetLastError));
 И потом сообщить этот код.
 И третье - какая делфи?
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Muratov Radik (статус: Посетитель), 2 апреля 2010, 14:37 [#16]:Да, возвращает нулевой хендл. Код ошибки = 0.
 Дельфи 7
 |  
|   | Вадим К (статус: Академик), 2 апреля 2010, 14:42 [#17]:Попробуйте вместо 'Button1' писать PChar('Button1') Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Muratov Radik (статус: Посетитель), 2 апреля 2010, 14:46 [#18]:Все равно хендл = 0. |  
|   | Вадим К (статус: Академик), 2 апреля 2010, 14:51 [#19]:в 4 буквы поверил бы. (просто делфи строки до 4 букв сохранят хитрым способом) Остался последний способ -
 s:string;
 /////
 s := 'Button1';
 cwnd := FindWindowEx(wnd, 0, 0, PChar(s));
 Если ненайдет, то подозреваю, что такой кнопки точно нет.
 А пробовали искать в других приложениях? А то некоторые умельцы умудряются вписать в название например латинскую o вместо кириллической о. На глаз не видно, а работать не будет.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Muratov Radik (статус: Посетитель), 2 апреля 2010, 14:55 [#20]:Сейчас попробую через string. А приложение это мое. Я его сделал специально для отладки. Там все названия проверил. |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |