Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/36: Рейтинг темы: голосов - 36, средняя оценка - 4.86
Shouldercannon
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 147
1

Найти окно и нажать кнопку

28.04.2011, 14:04. Просмотров 7113. Ответов 13
Метки нет (Все метки)

Если кнопка находится на Panel1 или PageControl1 и возмжно где-то ещё, то она не нажимается. Из-за чего это происходит?
Delphi
1
2
3
4
5
6
  if FindWindow(nil, 'Form1') <> 0 then
  begin
    Wind := FindWindow(nil, 'Form1');
    Btn := FindWindowEx(Wind, 0, nil, 'Кнопка');
    SendMessage(Btn, BM_CLICK, 0, 0);
  end;
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2011, 14:04
Ответы с готовыми решениями:

Нажать кнопку в webrowser
Подскажите пожалуйста , как нажать эту кнопку с помощью webbrowser'a &lt;button type=&quot;submit&quot;...

Нажать на кнопку в webbrowser
Всем привет. Как нажать программно нажать на кнопку такого вида через webbrowser &lt;div...

Программно нажать кнопку
Здравствуйте ! сделал мини браузер захожу по ссылки на сайт а там javascript который при...

Как нажать на кнопку клавишей?
У меня есть кнопка при нажатие на которую закрывается форма.Как сделать так чтоб на кнопку можно...

Как програмно нажать на кнопку?
Допустим есть форма и на ней кнопка. Как кнопку нажать программно??? Button1.click не помогает....

13
anonimus
2158 / 1248 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
28.04.2011, 14:10 2
потому что ты кнопку ищешь на форме, а ее там нет, она на панели.
Тебе нужно найти сначала хендл панели а потом уже искать кнопку
0
Shouldercannon
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 147
28.04.2011, 14:55  [ТС] 3
Автоматический поиск нельзя сделать, чтобы при указанных данных (заголовок окна и надпись на кнопке) были найдены все хендлы того на чём находится кнопка?

Добавлено через 32 минуты
Нашёл пример на C, не могу переписать на Delphi
Кратко о навигации по окнам:
У каждого окна (формы) как правило есть дочерние окна, т.е. объекты, находящиеся на этой форме. Каждого из этих объектов могут быть свои дочерние объекты, а у тех свои и т.д. Вот пример иерархии вложенности:

...................Главная______фор ма..........................
.................../........................... \........................
............Панель N1 ................. Панель N2...............
.........../........... \.................. /.............\..............
....нопка N1 .... Кнопка N2 ... Панель N3 ... Кнопка N3
................................... ......./................................
................................... Кнопка N4..........................

Таким образом навигацию по окнам можно сравнить с навигацией по файловой системе.
Раз у вас уже есть хэндл (назовём его hMain) "Главной формы", то остаётся "добраться" до нужной кнопки. Сделать это можно так:

Напишем рекурсивную функцию, которая будет обходить наше "оконное дерево", ища кнопку с именем "Кнопка N3". Вид функции:
HWND Walk(HWND Current,char * Name);

Где-нибудь в программе делаем вызов target=Walk(hMain,"Кнопка N3").
Код:


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HWND Walk(HWND Current,char * name)
{
  HWND temp;
  temp=GetWindow(Current,GW_CHILD); // находим первое дочернее окно
  while (temp!=NULL) // проверяем, а есть ли оно вообще
  {
     char WindowText[1024];
     GetWindowText(temp,WindowText,1023); // получаем его название
     if (!strcmp(name,WindowText)) return temp; // проверяем, искомая ли это кнопка, если да, то возвращаем её хэндл
 
     HWND result=Walk(temp,name); // если это была не она, то обходим её дочерние объекты
 
     if (result!=NULL) return result; // если при этом искомый объект был найден, возвращаем хэндл на него
 
     temp=GetWindow(temp,GW_HWNDNEXT) // иначе - проверяем следующий объект, дочерний для Current
  }
  return NULL; // объект не найден
}
Если в окне на который указывет хэндл hMain есть объект с именем "Кнопка N3", эта функция вернёт его хэндл, иначе - NULL.

Если обект найден, то на него осталось только нажать:
SendMessage(target,WM_LBUUTONDOWN,0 ,0);
И "отжать" его:
SendMessage(target,WM_LBUUTONUP,0,0 );
0
anonimus
2158 / 1248 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
28.04.2011, 15:49 4
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function TForm2.findNex(hd: hwnd; name: string): hwnd;
var tmp:hwnd; str:array[0..255]of char;
begin
fillchar(str,sizeof(str),#0);
tmp:=GetWindow(hd, gw_child);
while tmp <> 0 do begin
GetWindowText(tmp,str,sizeof(str));
if str=name then begin result:=tmp; exit; end;
  result:=findNex(tmp,name);
if result<>0 then exit;
 
tmp:=GetWindow(tmp, gw_HWndFirst);
end;
 
end;
вернется хендл того что ты ищешь
0
28.04.2011, 15:49
Shouldercannon
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 147
28.04.2011, 18:56  [ТС] 5
Как правильно задать данные для FindNex (Caption окна, Caption кнопки)?
Delphi
1
FindNex();
0
anonimus
2158 / 1248 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
28.04.2011, 19:00 6
какой же caption если у первого параметра тип hwnd
0
Shouldercannon
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 147
28.04.2011, 20:12  [ТС] 7
Delphi
1
FindNex(Handle, 'Form1');
Теперь вообще не понимаю как работает функция. По и дее ей надо передать CAption формы и Caption кнопки, чтобы знать где искать и что искать. А тут один параметр. Толи по Caption формы искать, толи Caption кнопки.
0
anonimus
2158 / 1248 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
28.04.2011, 20:35 8
Цитата Сообщение от Shouldercannon Посмотреть сообщение
По и дее ей надо передать CAption формы и Caption кнопки
это по чьей идее она должна так работать? как захотел так и написал )
первый параметр хандл родительского окна, второй Caption дочернего окна
0
Shouldercannon
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 147
28.04.2011, 20:55  [ТС] 9
Тоесть эта функция не годится дл поиска кнопки по Caption в чужой программе?
0
anonimus
2158 / 1248 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
28.04.2011, 20:58 10
она почему не годится, годится
0
Shouldercannon
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 147
28.04.2011, 21:18  [ТС] 11
Цитата Сообщение от anonimus Посмотреть сообщение
это по чьей идее она должна так работать? как захотел так и написал )
первый параметр хандл родительского окна, второй Caption дочернего окна
Где тогда Caption кнопки?
0
anonimus
2158 / 1248 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
28.04.2011, 22:10 12
сними ручник, кнопка это и есть "окно"
0
Shouldercannon
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 147
28.04.2011, 23:07  [ТС] 13
Если я правильно понял, то
первый параметр хандл родительского окна
- это Caption программы
второй Caption дочернего окна
- это Caption кнопки
0
anonimus
2158 / 1248 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
29.04.2011, 00:34 14
Цитата Сообщение от Shouldercannon Посмотреть сообщение
это Caption программы
какой нафик Caption, как Handle окна может быть Caption. Ты ерунду не пиши, задрал уже глупостями всякими

Добавлено через 1 час 7 минут
только маленькое уточнение к коду не
Delphi
1
tmp:=GetWindow(tmp, gw_HWndFirst);
а
Delphi
1
tmp:=GetWindow(tmp, GW_HWNDNEXT);
0
29.04.2011, 00:34
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.04.2011, 00:34

Программно нажать кнопку по номеру.
Пишу экранную клавиатуру. Необходимо по нажатию на батон, жать кнопку на клавиатуре по ее номеру....

Програмно нажать Кнопку (Button)
Надо с помощью кода нажать Кнопку (создать видимость нажатия). Как это реализовать?

Как нажать кнопку на клавиатуре?
Пытался keybd_event использовать, но увы оно не работает. Может кто приведет пример работы на более...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.