Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 64
1

Нажать кнопку в чужом окне размещенную внутри других компонентах

19.04.2013, 20:14. Просмотров 4983. Ответов 18
Метки нет (Все метки)

Перечитал инет, ответа ненашел. Имеем программу, вероятно написанную на Delphi. Окрыл ее в PE Explorer. Привожу скриншот оттуда. Мне нужно нажать кнопку tb_del_bad:TToolButton.
Я могу найти HWND главного окна так
Pascal
1
окноSMTP := FindWindow('tf_main', nil);
Окно находит верно, можно свернуть-развернуть для проверки, что HWND верный. А вот как дальше добраться до кнопки я не могу понять. Вызывая функцию
Pascal
1
p_regHWND := FindWindowEx(окноSMTP, 0, 'tpanel', nil);
Я получаю некий хэндл, но как я понимаю это хендл первой панели, а нужная кнопка в недрах второй. Повторный запуск этой же функции дает тот же самый хэндл, а мне нужна следующая ветвь.
Судя по этому дереву нужная кнопка находится по пути:
f_main:tf_main - p_main:tpanel - p_queue:tpanel - gb_queue:tgroupbox - ptb:tpanel - tb_queue:ttoolbar - tb_del_bad:ttoolbutton
Проблема еще в том, что компоненты не имеют заголовков, зоголовок есть только у окна, у них есть класс и имя. И как я понимаю по имени хэндл искать невозможно, можно или по классу или по заголовку.
Помогите
0
Миниатюры
Нажать кнопку в чужом окне размещенную внутри других компонентах  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.04.2013, 20:14
Ответы с готовыми решениями:

Нажать кнопку в чужом окне
Предположим для простоты я написал 2 проекта и обои в делфи.В первом приложении имеется 1 кнопка и...

Как нажать кнопку в чужом окне?
Добрый вечер! Помогите пожалуйста нажать на кнопку в чужом окне. Добрался до компонента (нашел его...

Не получается нажать на кнопку в чужом окне
Пытаюсь найти окно и кнопку в нем, по классу, класс узнал через spy++ Делаю проверку, h1, панель...

Нажать кнопку в чужом окне
Есть программа Steam нужно в ней нажать на кнопку "Создать новый аккаунт" Пробовал разные...

18
2644 / 2267 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
19.04.2013, 22:24 2
Цитата Сообщение от petademon Посмотреть сообщение
можно или по классу или по заголовку
или по счету - порядковому номеру в спискедочерних окон окна-родителя
0
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 64
19.04.2013, 22:53  [ТС] 3
Да по счету можно, но как мне попасть во вторую панель чтобы оказаться в нужной ветке.
0
2644 / 2267 / 278
Регистрация: 24.12.2010
Сообщений: 13,725
19.04.2013, 22:57 4
Цитата Сообщение от petademon Посмотреть сообщение
как мне попасть во вторую панель
Если она вторая - значит она вторая, не очевидно ли ?)
0
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 64
19.04.2013, 23:02  [ТС] 5
Проверил код
Pascal
1
2
3
  GetCursorPos(CurP);
  Wind := WindowFromPoint(CurP);
  GetClassNameA(Wind, ClName, 255);
Под курсором хэндл не берется, берет хендл TToolBar, а должен быть button

Добавлено через 1 минуту
Цитата Сообщение от mss Посмотреть сообщение
Если она вторая - значит она вторая, не очевидно ли ?)
На словах очевидно. Я не понимаю как получить хэндл второго элемента. Я уже писал что повторный вызов функции FindWindowEx всегда берет только хндл первого элемента типа панель. Второй как получить?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
29626 / 19496 / 7642
Регистрация: 22.10.2011
Сообщений: 34,017
Записей в блоге: 6
19.04.2013, 23:37 6
petademon, у FindWindowEx есть параметр hwndChildAfter (второй по счету), если в него передать хендл найденного перед этим первого потомка - то будет найден что? Правильно, первый после первого, то есть, второй, и так далее...
0
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 64
20.04.2013, 00:37  [ТС] 7
Цитата Сообщение от UI Посмотреть сообщение
petademon, у FindWindowEx есть параметр hwndChildAfter (второй по счету), если в него передать хендл найденного перед этим первого потомка - то будет найден что? Правильно, первый после первого, то есть, второй, и так далее...
Нет это не работает
Pascal
1
2
3
4
  окноSMTP := FindWindow('tf_main', nil);
  p_regHWND := FindWindowEx(окноSMTP, 0, 'tpanel', nil);
  p_queueHWND := FindWindowEx(окноSMTP, p_regHWND, 'tpanel', nil);
  gb_queueHWND := FindWindowEx(p_queueHWND, 0, 'tgroupbox', nil);
Здесь p_regHWND p_queueHWND gb_queueHWND имеют одинаковые значения.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
29626 / 19496 / 7642
Регистрация: 22.10.2011
Сообщений: 34,017
Записей в блоге: 6
20.04.2013, 02:48 8
Цитата Сообщение от petademon Посмотреть сообщение
Нет это не работает
Это прекрасно работает, если б оно не работало, я б не предлагал этот метод:
Нажать кнопку в чужом окне размещенную внутри других компонентах


А что там у тебя творится - совершенно непонятно.
0
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 64
20.04.2013, 10:48  [ТС] 9
Цитата Сообщение от UI Посмотреть сообщение
Это прекрасно работает, если б оно не работало, я б не предлагал этот метод:
Вложение 258264

А что там у тебя творится - совершенно непонятно.
Продолжите пожалуйста ваш код, покажите как получить у вас хэндл кнопки Button 5 на 1 панели
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
29626 / 19496 / 7642
Регистрация: 22.10.2011
Сообщений: 34,017
Записей в блоге: 6
20.04.2013, 12:44 10
Да пожалуйста:
Нажать кнопку в чужом окне размещенную внутри других компонентах

В чем проблема-то?
0
2474 / 1850 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
20.04.2013, 13:41 11
Получить окно ToolBar-а не составляет проблем, данные о кнопках получить не удаётся.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function EnumChildProc(WndCtrl : HWND; lParam : Longint) : Boolean; stdcall;
var
  szClass : array[Byte] of Char;
  tbb     : TTBButton;
  Button  : TControl;
  I, J    : Integer;
begin
  Result := True;
 
  GetClassName(WndCtrl, szClass, SizeOf(szClass));
  if (lstrcmpi(szClass, 'TTOOLBAR') = 0) then
  begin
    J := SendMessage(WndCtrl, TB_BUTTONCOUNT, 0, 0);
    if J > 0 then
      for I := 0 to J - 1 do
      begin
        FillChar(tbb, SizeOf(TTBBUTTON), 0);
        // Переменная tbb не заполняется данными о кнопке
        if SendMessage(WndCtrl, TB_GETBUTTON, I, Longint(@tbb)) = 0 then
          Exit;
        // следующий код не работает
        Button := TControl(tbb.dwData);
        if Assigned(Button) and (Button is TToolButton) and ((Button as TToolButton).Name = 'tb_del_bad') then
          TToolButton(Button).Click;
    end;
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  h : HWND;
begin
  h := FindWindow(NIL, 'tf_Main');
  if h <> 0 then
    if (not EnumChildWindows(h, @EnumChildProc, 0)) then
      Exit;
end;
возможно из-за того что запрашивается из другого приложения.

Добавлено через 31 минуту
Скопировал этот код в приложение где расположен ToolBar. Всё работает. Теперь бы узнать как получить данные о кнопках из другого приложения.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
29626 / 19496 / 7642
Регистрация: 22.10.2011
Сообщений: 34,017
Записей в блоге: 6
20.04.2013, 13:57 12
Пардон, а с каких пор TOOLBARBUTTON вообще имеет хендл? Это не окно, чтобы иметь его. Вот так кнопка прекрасно нажимается по индексу:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
var
  tb : HWND;
  rc : TRect;
 
  dwProcessID : DWORD;
  hProcess : THANDLE;
  p : Pointer;
  BytesRead : NativeUInt;
 
// ...
 
  tb := FindWindowEx(form, 0, 'TToolbar', nil);
 
  GetWindowThreadProcessId(tb, @dwProcessID);
  hProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, False, dwProcessID);
  p := VirtualAllocEx(hProcess, nil, 4096, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
 
  SendMessage(tb, TB_GETITEMRECT, 2, LParam(p));
  ReadProcessMemory(hProcess, p, @rc, sizeof(rc), BytesRead);
 
  SendMessage(tb, TB_GETITEMRECT, 2, LParam(@rc));
  PostMessage(tb, WM_LBUTTONDOWN, 0, MakeLParam(rc.left, rc.top));
  PostMessage(tb, WM_LBUTTONUP, 0, MakeLParam(rc.left, rc.top));
 
  // не забудь освободить память...
0
2474 / 1850 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
20.04.2013, 14:18 13
Цитата Сообщение от UI Посмотреть сообщение
а с каких пор TOOLBARBUTTON вообще имеет хендл?
А где видно по коду, чтобы я искал хендл кнопок? Я пытался получить данные о них через tbb.dwData (TTBButton). Нажать по индексу несложно, но я исходил из того, что этот индекс неизвестен (хотя для приведённого ТС скрина мы его знаем).
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
29626 / 19496 / 7642
Регистрация: 22.10.2011
Сообщений: 34,017
Записей в блоге: 6
20.04.2013, 14:23 14
Цитата Сообщение от angstrom Посмотреть сообщение
А где видно по коду, чтобы я искал хендл кнопок?
Я TC-у говорил. Он начал искать хендлы через FindWindowEx Так ищутся только сами TToolBar-ы, а уж всё, что на них - это по индексу...
0
2474 / 1850 / 242
Регистрация: 14.09.2012
Сообщений: 5,981
Записей в блоге: 2
20.04.2013, 14:26 15
В этом и проблема, не зная индекса кнопки её не найдёшь.
0
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 64
20.04.2013, 17:54  [ТС] 16
Цитата Сообщение от UI Посмотреть сообщение
Да пожалуйста:
Вложение 258336
В чем проблема-то?
Я незнаю что не получается, не заходит код ниже второго уровня. Вот код
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
  окно, панельreg, панельmain, панельlogs, панельqueue, групбоксqueue: HWND;
begin
  окно := FindWindow('tf_main', nil);
  Memo1.Lines.Add(IntToStr(окно) + ' - хэндл окна');
 
  панельreg := FindWindowEx(окно, 0, 'tpanel', nil);
  Memo1.Lines.Add(IntToStr(панельreg) + ' - хэндл  панельreg');
 
  панельmain := FindWindowEx(окно, панельreg, 'tpanel', nil);
  Memo1.Lines.Add(IntToStr(панельmain) + ' - хэндл панельmain');
 
  панельlogs := FindWindowEx(панельmain, 0, 'tpanel', nil);
  Memo1.Lines.Add(IntToStr(панельlogs) + ' - хэндл панельlogs');
 
  панельqueue := FindWindowEx(панельmain, панельlogs, 'tpanel', nil);
  Memo1.Lines.Add(IntToStr(панельqueue) + ' - хэндл панельqueue');
 
  групбоксqueue := FindWindowEx(панельqueue, 0, 'tgroupbox', nil);
  Memo1.Lines.Add(IntToStr(групбоксqueue) + ' - хэндл групбоксqueue');
Вот что пишется в мемо:
132874 - хэндл окна
525968 - хэндл панельreg
132944 - хэндл панельmain
0 - хэндл панельlogs
0 - хэндл панельqueue
0 - хэндл групбоксqueue
Что может быть не так?

Добавлено через 2 минуты
Дад да мне надо нажать на кнопку в тулбаре. Она девятая по счету. Как найти ее индекс?

Добавлено через 13 минут
Я знаю, что обработчик нажатия на нужную кнопку называется tb_del_badClick. Это может помочь?
0
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 64
23.04.2013, 10:28  [ТС] 17
Ну что, никто не скажет как добраться до кнопки в тулбаре?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
29626 / 19496 / 7642
Регистрация: 22.10.2011
Сообщений: 34,017
Записей в блоге: 6
23.04.2013, 10:39 18
Уже сказали: у кнопок на тулбаре нет хендлов, и добраться до них иначе как по индексу - нельзя. Как добраться до самого тулбара тоже было показано. Равно как и само нажатие кнопки. Больше ничем помочь не могу. Хендл, которого нет, получить нельзя.

Цитата Сообщение от petademon Посмотреть сообщение
Она девятая по счету. Как найти ее индекс?
Она девятая по счету, т.е., от 0 - имеет индекс = 8?
0
1 / 1 / 0
Регистрация: 19.04.2013
Сообщений: 64
23.04.2013, 17:48  [ТС] 19
Цитата Сообщение от UI Посмотреть сообщение
Уже сказали: у кнопок на тулбаре нет хендлов, и добраться до них иначе как по индексу - нельзя. Как добраться до самого тулбара тоже было показано. Равно как и само нажатие кнопки. Больше ничем помочь не могу. Хендл, которого нет, получить нельзя.

Она девятая по счету, т.е., от 0 - имеет индекс = 8?
Хорошо, а скажите пожалуйста где в вашем коде, в каком из параметров указывается индекс?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.04.2013, 17:48

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Нажать на кнопку в чужом окне
Добрый день, подскажите, есть ли возможность получить доступ к контролам чужой формы? Т.е. есть...

Нажать ctrl+s в чужом окне
почему не работаетprocedure TForm1.Button1Click(Sender: TObject); var h : thandle; begin ...

Программно нажать клавишу клавиатуры в чужом окне
Ребят , что не так не могу разобраться , может программа обрабатывает нажатие по другому... Есть...

Как программно нажать клавиши на клавиатуре в чужом окне?
Всем привет, кодеры! На днях я решил сделать прогу для автоматического ввода кодов в GTA. Все уже...

Нажать кнопку в чужом приложении
Помогите нажать кнопку на &quot;левом&quot; приложение !!!!!

Нажать кнопку в окне
Здравствуйте. Как с помощью VBscript нажать на кнопку Start в этом окне&gt;&gt;&gt; Спасибо.


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

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

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