Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/26: Рейтинг темы: голосов - 26, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 25
1

Поиск кнопок в другом приложении

12.09.2012, 11:23. Показов 5078. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите)
Пользователь выбирает приложение,в этом приложении нужно найти все кнопки и по очереди их нажать
(в разном порядке,ну это пока не важно).
Ну как открыть понятно,а вот как найти все кнопки?и потом их нажать!?)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.09.2012, 11:23
Ответы с готовыми решениями:

Нажатие кнопок в стороннем приложении
------------------------------------ public void button1_Click(object sender, EventArgs e) ...

Нажатие кнопок в стороннем приложении
Возможно ли автоматом нажимать на кнопки в другом приложении? Есть примеры ?)

Нажатие кнопок в стороннем приложении (игре)
Приложение должно способом имуляции нажимать на кнопки в игре, но данные способ не работает, тоесть...

Нажатие клавиши в другом приложении
Суть в том, что мне нужно нажать кнопку "F" в другом приложении. Я знаю его позицию и выделяю это...

11
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
12.09.2012, 12:40 2
Найти хендл окна приложения через FindWindow, а потом - все его дочерние кнопки, либо EnumChildWindows, либо FindWindowEx
0
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 25
12.09.2012, 14:10  [ТС] 3
А подробнее можно?!
Просто там надо заголовок формы и кнопок писать)
А у меня то они не известны

Добавлено через 44 минуты
Как найти handle приложения,которое я открыл?
0
210 / 169 / 24
Регистрация: 24.04.2012
Сообщений: 615
12.09.2012, 14:18 4
Поставь утилиту Windows Inspector или что-то подобное, она покажет тебе все окна, там можешь узнать handle окна, или его имя и класс, чтоб найти с помощью findwindow.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
12.09.2012, 14:22 5
Как же ты собрался работать с чужим приложением, не зная даже его заголовка? Ну, в крайнем случае запустишь его не через ShellExecute, а через CreateProcess, и потом по PID найдешь хендл главного окна чужого приложения. А для поиска кнопок вообще не надо никаких заголовков знать:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function myEnumFunc(hChild : HWND; L : LPARAM) : BOOL; stdcall;
var
   sClass : array[0 .. 255] of Char;
   sCaption : array[0 .. 255] of Char;
begin
   GetClassName(hChild, @sClass, 255);
   if StrPas(sClass) = 'Button' then
   begin
      SendMessage(hChild, WM_GETTEXT, 255, Integer(@sCaption));
      Form1.Memo2.Lines.Add(Format('Class = %s, Caption = %s, Handle = %d',
         [sClass, sCaption, hChild]));
   end;
   Result := True;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var h : hwnd;
begin
   h := FindWindow(nil, 'Calculator');
 
   // Под WinXP прекрасно вытаскивает список кнопок из калькулятора
   EnumChildWindows(h, @MyEnumFunc, 0);
end;
Продолжай
1
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 25
12.09.2012, 14:44  [ТС] 6
Чето не понял чем мне эта утилита поможет
Мне надо как-то вырвать handle у только что открывшегося приложения

Добавлено через 4 минуты
Кароче эта прога будет для теста других программ
Сначала пользователь через мою программу выбирает, приложение которое надо протестить (поэтому я не знаю заголовка)
потом моя программа ищет все кнопки на этом приложении,и начинает на них нажимать в разном порядке,при этом вести журнал событий)
таким образом пользователь узнает на каком месте другая программа перестает работать))

Добавлено через 4 минуты
Цитата Сообщение от UI Посмотреть сообщение
Как же ты собрался работать с чужим приложением, не зная даже его заголовка? Ну, в крайнем случае запустишь его не через ShellExecute, а через CreateProcess, и потом по PID найдешь хендл главного окна чужого приложения. А для поиска кнопок вообще не надо никаких заголовков знать:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function myEnumFunc(hChild : HWND; L : LPARAM) : BOOL; stdcall;
var
   sClass : array[0 .. 255] of Char;
   sCaption : array[0 .. 255] of Char;
begin
   GetClassName(hChild, @sClass, 255);
   if StrPas(sClass) = 'Button' then
   begin
      SendMessage(hChild, WM_GETTEXT, 255, Integer(@sCaption));
      Form1.Memo2.Lines.Add(Format('Class = %s, Caption = %s, Handle = %d',
         [sClass, sCaption, hChild]));
   end;
   Result := True;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var h : hwnd;
begin
   h := FindWindow(nil, 'Calculator');
 
   // Под WinXP прекрасно вытаскивает список кнопок из калькулятора
   EnumChildWindows(h, @MyEnumFunc, 0);
end;
Продолжай
Здесь ты ищешь кнопки конкретно у калькулятора h := FindWindow(nil, 'Calculator');
А мне не известно в какой программе я буду искать,вернее в той которую только что открыл)
0
210 / 169 / 24
Регистрация: 24.04.2012
Сообщений: 615
12.09.2012, 14:49 7
Цитата Сообщение от nikitos10 Посмотреть сообщение
при этом вести журнал событий)
таким образом пользователь узнает на каком месте другая программа перестает работать
Т.Е. функционал твоей программы заключается в нахождении кнопки "Выход" в других приложениях?
0
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 25
12.09.2012, 14:50  [ТС] 8
Нет,она будет проверять при какой последовательности нажимания кнопок,программа виснет или выдает ошибку)
0
210 / 169 / 24
Регистрация: 24.04.2012
Сообщений: 615
12.09.2012, 14:51 9
А как она узнает, что программа повисла, или выдала ошибку? )))
0
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 25
12.09.2012, 14:53  [ТС] 10
А вот этого я пока не знаю))

Добавлено через 1 минуту
Для начала мне хотябы реализовать чтоб она нашла все кнопки и начала на них нажимать,а дальше буду думать)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,432
Записей в блоге: 8
12.09.2012, 15:01 11
Цитата Сообщение от nikitos10 Посмотреть сообщение
Здесь ты ищешь кнопки конкретно у калькулятора h := FindWindow(nil, 'Calculator');
А мне не известно в какой программе я буду искать,вернее в той которую только что открыл)
Во-первых, если ты только что открыл программу, GetForegroundWindow должен дать хендл ее окна (только надо подождать некоторое время, пока приложение успеет загрузиться). Не устраивает - я тебе уже сказал: запускаешь процесс через CreateProcess, и по его PID находишь хендл главного окна (подсказка: перечисление всех окон верхнего уровня, для каждого из них получаешь с помощью GetWindowThreadProcessId PID создавшего его процесса и сравниваешь с полученным из CreateProcess. Если совпадают - можешь хлопать в ладоши, ты нашел окно). Что делать дальше - я показал...

Перенести в раздел https://www.cyberforum.ru/delphi-winapi/ ?
1
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 25
12.09.2012, 15:09  [ТС] 12
Спасибо за помощь,буду пробовать
0
12.09.2012, 15:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.09.2012, 15:09
Помогаю со студенческими работами здесь

Нажатие кнопки в другом приложении
Всем привет, прошу помощи.(Если было - не смог найти похожее) Есть окно, когда в этом окне...

Нажатие меню в другом приложении
Уважаемые форумчане. Вопрос такой. Мне нужно в чужой программе(в торрент клиенте) программно нажать...

Нажатие на клавишу в другом приложении
Здравствуйте дорогие форумчане , появилась ошибка от куда не ожидал . Вобщем отлаваливаю хендл...

Нажатие клавиш в другом приложении
Всем привет уважаемые форумчане . У меня такая проблема . хочу написать бота для игры нажатие...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru