Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/29: Рейтинг темы: голосов - 29, средняя оценка - 4.55
1 / 1 / 0
Регистрация: 20.10.2017
Сообщений: 32

Найти окно чужой программы по названию кнопки в окне

28.10.2017, 21:08. Показов 6415. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток дорогие знатоки!
Помогите пожалуйста с возникшей проблемой:
1. как определить окно если известно название кнопки(Button), так как Caption окна отсутствует(
2. как я понимаю Handle окна меняется при каждом запуске программы, и определив его с помощью спцпрограмм к нему не обратится после перезапуска приложения.
3. Как еще можно найти окно чужой программы при отсутствии у него Caption.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.10.2017, 21:08
Ответы с готовыми решениями:

Получить иконку чужой программы по названию класса
Подскажите пожалуста! Это не ланчер, а отладчик МОИХ-же программ. Для каждой знаю название классов. Но иконку хочу получать из...

Встроить свое окно в окно чужой программы
Что то я не могу допереть как такое можно организовать,Хочу свое окно в чужую программу встроить,пример такой программы spy++ там основные...

Динамическая замена переменных в окне чужой программы
Всем привет! Кто знает, пожалуйста, подскажите куда копать. Есть программа - покер клиент (сторонняя, без исходников), после запуска...

27
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6817 / 2056 / 239
Регистрация: 14.12.2014
Сообщений: 4,320
Записей в блоге: 12
02.11.2017, 19:53
Студворк — интернет-сервис помощи студентам
Вот пример готовой проги
Вложения
Тип файла: rar TestFindWindow.rar (3.5 Кб, 21 просмотров)
1
1 / 1 / 0
Регистрация: 20.10.2017
Сообщений: 32
02.11.2017, 21:00  [ТС]
Вот нашел как загрузить)
Миниатюры
Найти окно чужой программы по названию кнопки в окне  
0
1 / 1 / 0
Регистрация: 20.10.2017
Сообщений: 32
02.11.2017, 23:56  [ТС]
вроде поборол эту проблему ответ оказался бонален нужно было поставить sleep перед вызовом функции. Однако теперь новая проблема после примерно десяти запусков функции она зависает- сто это может быть??
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6817 / 2056 / 239
Регистрация: 14.12.2014
Сообщений: 4,320
Записей в блоге: 12
03.11.2017, 10:57
Что-то я на этом скрине ничего не вижу. Где видно, кто родитель, кто потомок, где видно заголовок окна (uDisk ToolBar)?
Я не могу ничего сказать о коде, не видя его... полностью желательно.

Добавлено через 4 минуты
Ищите место зависания.
Вставляйте после каждой строки OutputDebugString('1'); ('2', '3', '4', '5') и потом просматривайте через View -> Debug Window -> Event Log (Ctrl+Alt+V) какое сообщение было выведено последним...
0
1 / 1 / 0
Регистрация: 20.10.2017
Сообщений: 32
04.11.2017, 16:51  [ТС]
Jin X, тот вариант, что Вы предложили выше, не находит кнопки (hWnd, 0, 'Button', 'Lo').
функция:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function EnumWindowsProc(hWnd: THandle; lParam: Integer): LongBool; stdcall;// поиск кнопки ЛО
var H,y: THandle;
begin
h:=0;
 y:=0;
  H := FindWindowEx(hWnd, 0, 'Button', 'Lo');
  y:=  FindWindowEx(hWnd, 0, 'edit', '');
  if H = 0 then begin
  EnumChildWindows(hWnd, @EnumWindowsProc, 0) ;
   
  end
      else
        begin
  SendMessage(y, WM_SETTEXT, 0, Integer(PChar('123')));
  SetForegroundWindow(h);
  postMessage(h,WM_LBUTTONDOWN,0, 0);
  postMessage(h,WM_LBUTTONUP,0, 0);
    postMessage(hWnd, WM_QUIT, 0, 0);
  end;
  Result := True;
end;
работает, но как то не стабильно, приблизительно, после десятого нажатия она зависает. Я думаю, что может быть надо как-то очищать переменные? Все так же надеюсь на Вашу помощь.
Миниатюры
Найти окно чужой программы по названию кнопки в окне  
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6817 / 2056 / 239
Регистрация: 14.12.2014
Сообщений: 4,320
Записей в блоге: 12
05.11.2017, 15:33
Цитата Сообщение от sonyk Посмотреть сообщение
Jin X, тот вариант, что Вы предложили выше, не находит кнопки (hWnd, 0, 'Button', 'Lo').
Потому что кнопки находятся непосредственно в окне #32770, а не внутри другого окна, который находится в #32770.
Я не могу понять - какое отношение #32770 с заголовком uDisk ToolBar имеет к окну #32770 с кнопкой и edit?
У них просто общий родитель? Это две дочки одного родителя?

Если да, то этот родитель – топовое окно (судя по всему да, но на всякий случай спрошу)?

Добавлено через 2 минуты
Получается так: мы перебираем топовые окна и находим в одном из них окно #32770/"uDisk ToolBar", затем берём его родителя (топовое окно) и ищем внутри него другое окно класса #32770, в котором должны быть Button и Edit.
Верно?

Добавлено через 38 минут
Тогда берёте ту же самую процедуру FindChildWindow из сообщения #20 и делаете так:
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
procedure TForm1.Button1Click(Sender: TObject);
var H, E, Parent: THandle;
begin
  H := FindChildWindow(0, '#32770', 'uDisk ToolBar', Parent);
  if H = 0 then
  begin
    ShowMessage('Window "uDisk ToolBar" not found :(');
    Exit;
  end;
  H := FindChildWindow(Parent, 'Button', 'Lo', Parent);
  if H = 0 then
  begin
    ShowMessage('Button not found :(');
    Exit;
  end;
  E := FindWindowEx(Parent, 0, 'Edit', '');
  if E = 0 then
  begin
    ShowMessage('Edit not found :(');
    Exit;
  end;
  SendMessage(E, WM_SETTEXT, 0, Integer(PChar('Hello')));
  SendMessage(H, BM_CLICK, 0, 0);
end;
Только здесь нет проверки того, что родитель кнопки и edit должен иметь класс #32770... а нужно ли (если он родитель "uDisk ToolBar")?

Добавлено через 21 минуту
Или вот, более усовершенствованный вариант (с проверкой класса родителя):
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
{$B-}
type
  TFindChildWindowCheckProc = function(hWnd, Parent: THandle): Boolean;
 
function FindChildWindow(InWnd: THandle; const ClassName, Title: String; out Parent: THandle; FirstWinSearch: Boolean = True; CheckFunc: TFindChildWindowCheckProc = nil): THandle;
type
  TInfo = record
    H, P: THandle;
    Cls, Ttl: PChar;
    ChkFn: TFindChildWindowCheckProc;
  end;
type
  PInfo = ^TInfo;
 
  function EnumWindowsProc(hWnd: THandle; Info: PInfo): LongBool; stdcall;
  begin
    with Info^ do
    begin
      H := FindWindowEx(hWnd, 0, Cls, Ttl);
      if H = 0 then EnumChildWindows(hWnd, @EnumWindowsProc, LParam(Info))
      else if (@ChkFn <> nil) and not ChkFn(H, hWnd) then H := 0
      else P := hWnd;
      Result := (H = 0);
    end;
  end;
 
var Info: TInfo;
begin
  with Info do
  begin
    H := 0;
    Cls := PChar(ClassName);
    Ttl := PChar(Title);
    if FirstWinSearch then
    begin
      H := FindWindowEx(InWnd, 0, Cls, Ttl);
      if H <> 0 then
        if (@CheckFunc <> nil) and not CheckFunc(H, InWnd) then H := 0
        else P := InWnd;
    end;
    if H = 0 then
    begin
      P := 0;
      ChkFn := CheckFunc;
      EnumChildWindows(InWnd, @EnumWindowsProc, LParam(@Info));
    end;
    Result := H;
    if @Parent <> nil then Parent := P;
  end;
end;
 
function CheckParent(H, P: THandle): Boolean;
var S: PChar;
begin
  GetMem(S, 16);
  Result := (GetClassName(P, S, 16) <> 0) and (S = '#32770');
  FreeMem(S);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var H, E, Parent: THandle;
begin
  H := FindChildWindow(0, '#32770', 'uDisk ToolBar', Parent, False);
  if H = 0 then
  begin
    ShowMessage('Window "uDisk ToolBar" not found :(');
    Exit;
  end;
  H := FindChildWindow(Parent, 'Button', 'Lo', Parent, True, CheckParent);
  if H = 0 then
  begin
    ShowMessage('Button not found :(');
    Exit;
  end;
  E := FindWindowEx(Parent, 0, 'Edit', '');
  if E = 0 then
  begin
    ShowMessage('Edit not found :(');
    Exit;
  end;
  SendMessage(E, WM_SETTEXT, 0, Integer(PChar('Hello from TEST!')));
  SendMessage(H, BM_CLICK, 0, 0);
end;
Усложнено немного, зато универсально
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6817 / 2056 / 239
Регистрация: 14.12.2014
Сообщений: 4,320
Записей в блоге: 12
05.11.2017, 15:36
Пример...
Вложения
Тип файла: zip Example.zip (7.8 Кб, 11 просмотров)
0
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6817 / 2056 / 239
Регистрация: 14.12.2014
Сообщений: 4,320
Записей в блоге: 12
05.11.2017, 15:42
В 69-й строке лучше False использовать для этого случая:
Delphi
69
H := FindChildWindow(Parent, 'Button', 'Lo', Parent, False, CheckParent);
Добавлено через 1 минуту
Параметр FirstWinSearch – это нужно ли искать в окне, которое передаётся первым параметром (InWnd).
А поскольку кнопка и edit находится не в самом родителе, а в его потомке, то смысла там искать нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.11.2017, 15:42

Как сделать окно чужой программы невидимым?
Как сделать окно чужой программы невидимым?

Спрятать окно чужой программы до его появления
Есть у меня МФУ Canon MG5140. Отличная штука. Позволяет сканировать прямо с самого МФУ. Но при этом возникает неудобство: при...

Вывод чужой программы в свое окно. Как?
Есть программа , запускаю Process p = new Process(); ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = @&quot;c:Program...

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

Можно ли свернуть или скрыть окно чужой программы, если оно создано не средствами WinAPI?
То есть есть программа, окно которой, мне кажется, создано не средствами WinAPI: команды SW_MINIMIZE и SW_HIDE, как и другие, на него не...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru