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

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

19.04.2013, 20:14. Показов 7537. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.04.2013, 20:14
Ответы с готовыми решениями:

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

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

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

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

Добавлено через 1 минуту
Цитата Сообщение от mss Посмотреть сообщение
Если она вторая - значит она вторая, не очевидно ли ?)
На словах очевидно. Я не понимаю как получить хэндл второго элемента. Я уже писал что повторный вызов функции FindWindowEx всегда берет только хндл первого элемента типа панель. Второй как получить?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
19.04.2013, 23:37
petademon, у FindWindowEx есть параметр hwndChildAfter (второй по счету), если в него передать хендл найденного перед этим первого потомка - то будет найден что? Правильно, первый после первого, то есть, второй, и так далее...
0
3 / 3 / 0
Регистрация: 19.04.2013
Сообщений: 64
20.04.2013, 00:37  [ТС]
Цитата Сообщение от 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
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
20.04.2013, 02:48
Цитата Сообщение от petademon Посмотреть сообщение
Нет это не работает
Это прекрасно работает, если б оно не работало, я б не предлагал этот метод:


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

А что там у тебя творится - совершенно непонятно.
Продолжите пожалуйста ваш код, покажите как получить у вас хэндл кнопки Button 5 на 1 панели
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
20.04.2013, 12:44
Да пожалуйста:

В чем проблема-то?
0
angstrom
20.04.2013, 13:41
Получить окно 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. Всё работает. Теперь бы узнать как получить данные о кнопках из другого приложения.
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
20.04.2013, 13:57
Пардон, а с каких пор 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
angstrom
20.04.2013, 14:18
Цитата Сообщение от UI Посмотреть сообщение
а с каких пор TOOLBARBUTTON вообще имеет хендл?
А где видно по коду, чтобы я искал хендл кнопок? Я пытался получить данные о них через tbb.dwData (TTBButton). Нажать по индексу несложно, но я исходил из того, что этот индекс неизвестен (хотя для приведённого ТС скрина мы его знаем).
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
20.04.2013, 14:23
Цитата Сообщение от angstrom Посмотреть сообщение
А где видно по коду, чтобы я искал хендл кнопок?
Я TC-у говорил. Он начал искать хендлы через FindWindowEx Так ищутся только сами TToolBar-ы, а уж всё, что на них - это по индексу...
0
angstrom
20.04.2013, 14:26
В этом и проблема, не зная индекса кнопки её не найдёшь.
3 / 3 / 0
Регистрация: 19.04.2013
Сообщений: 64
20.04.2013, 17:54  [ТС]
Цитата Сообщение от 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
3 / 3 / 0
Регистрация: 19.04.2013
Сообщений: 64
23.04.2013, 10:28  [ТС]
Ну что, никто не скажет как добраться до кнопки в тулбаре?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
23.04.2013, 10:39
Уже сказали: у кнопок на тулбаре нет хендлов, и добраться до них иначе как по индексу - нельзя. Как добраться до самого тулбара тоже было показано. Равно как и само нажатие кнопки. Больше ничем помочь не могу. Хендл, которого нет, получить нельзя.

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

Она девятая по счету, т.е., от 0 - имеет индекс = 8?
Хорошо, а скажите пожалуйста где в вашем коде, в каком из параметров указывается индекс?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.04.2013, 17:48
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru