Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/49: Рейтинг темы: голосов - 49, средняя оценка - 4.73
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 169

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

28.04.2011, 14:04. Показов 10049. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.04.2011, 14:04
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 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
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
28.04.2011, 15:49
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
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 169
28.04.2011, 18:56  [ТС]
Как правильно задать данные для FindNex (Caption окна, Caption кнопки)?
Delphi
1
FindNex();
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
28.04.2011, 19:00
какой же caption если у первого параметра тип hwnd
0
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 169
28.04.2011, 20:12  [ТС]
Delphi
1
FindNex(Handle, 'Form1');
Теперь вообще не понимаю как работает функция. По и дее ей надо передать CAption формы и Caption кнопки, чтобы знать где искать и что искать. А тут один параметр. Толи по Caption формы искать, толи Caption кнопки.
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
28.04.2011, 20:35
Цитата Сообщение от Shouldercannon Посмотреть сообщение
По и дее ей надо передать CAption формы и Caption кнопки
это по чьей идее она должна так работать? как захотел так и написал )
первый параметр хандл родительского окна, второй Caption дочернего окна
0
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 169
28.04.2011, 20:55  [ТС]
Тоесть эта функция не годится дл поиска кнопки по Caption в чужой программе?
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
28.04.2011, 20:58
она почему не годится, годится
0
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 169
28.04.2011, 21:18  [ТС]
Цитата Сообщение от anonimus Посмотреть сообщение
это по чьей идее она должна так работать? как захотел так и написал )
первый параметр хандл родительского окна, второй Caption дочернего окна
Где тогда Caption кнопки?
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
28.04.2011, 22:10
сними ручник, кнопка это и есть "окно"
0
3 / 3 / 8
Регистрация: 25.05.2010
Сообщений: 169
28.04.2011, 23:07  [ТС]
Если я правильно понял, то
первый параметр хандл родительского окна
- это Caption программы
второй Caption дочернего окна
- это Caption кнопки
0
 Аватар для anonimus
2184 / 1255 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
29.04.2011, 00:34
Цитата Сообщение от Shouldercannon Посмотреть сообщение
это Caption программы
какой нафик Caption, как Handle окна может быть Caption. Ты ерунду не пиши, задрал уже глупостями всякими

Добавлено через 1 час 7 минут
только маленькое уточнение к коду не
Delphi
1
tmp:=GetWindow(tmp, gw_HWndFirst);
а
Delphi
1
tmp:=GetWindow(tmp, GW_HWNDNEXT);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.04.2011, 00:34
Помогаю со студенческими работами здесь

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

Как програмно нажать на кнопку?
Допустим есть форма и на ней кнопка. Как кнопку нажать программно??? Button1.click не помогает. Плиз помогите. Оч надо.

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru