Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
3 / 3 / 1
Регистрация: 05.04.2010
Сообщений: 84

Нажать кнопку в окне стороннего приложения

16.08.2014, 09:05. Показов 3634. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Как с помощью VBscript нажать на кнопку Start в этом окне>>>
Спасибо.

Не буду заморачиваться, на Delphi напишу прогу)
 Комментарий модератора 
Посему переносим тему в Delphi
Миниатюры
Нажать кнопку в окне стороннего приложения  
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2014, 09:05
Ответы с готовыми решениями:

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

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

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

29
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
18.08.2014, 19:28
Студворк — интернет-сервис помощи студентам
Не то окно с кнопкой надо закрыть FraidZZ а саму программу)
о какой именно программе идет речь?
0
3 / 3 / 1
Регистрация: 05.04.2010
Сообщений: 84
19.08.2014, 17:40  [ТС]
И куда его этот WM_QUIT ???

Добавлено через 2 минуты
Цитата Сообщение от raxp Посмотреть сообщение
о какой именно программе идет речь?
Надо в конце еще закрыть само консольное приложение код которого ты мне дал
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
19.08.2014, 18:51
Delphi
1
off:= true;
p.s.: а ман по активации сервиса вы значит не прочитали.
0
Заблокирован
20.08.2014, 00:02
надо только немного подумать и выяснить класс окна кнопки
Это удобно делается с помощью вот этой тулзы на VB.NET: Готовые решения и полезные коды на Visual Basic .NET (Часть-1)
Исходный код в комплекте.
И там же показано, как с WinAPI на VB.NET работать.

Кто хочет, может и на Delphi переписать (он для таких вещей лучше подходит) и поделиться с комьюнити...
Или допилить до уровня в-10-раз-круче-Spy++ и срубить бабла на продажах
Всякие боты и автокликеры весьма популярны, так что навороченный анализатор различного рода окон и веб-страниц пригодился бы.
0
3 / 3 / 1
Регистрация: 05.04.2010
Сообщений: 84
20.08.2014, 18:53  [ТС]
raxp не почтитайте меня тупым, но че то все равно не закрывается черное окно программы когда сворачивает Alarm DB Logger Manager, хоть ты тресни(( вот что у меня получилось>>>

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
program alarmclick;
 
uses Messages, Classes, Windows, mmsystem;
 
 
type
 // класс-обработчик сообщений ситемы
 TF = class
 protected
  constructor Create;
  destructor Destroy; override;
 
  // подписываемся на завершение работы и перезагрузку
  procedure WndProcc(var Msgs:TMessage); message WM_QUERYENDSESSION;
 
end;
 
 
var
  FWnd: HWnd;
  t : tf;
  Msg: tmsg;
  tmr1: cardinal;
  off: boolean = false;
 
 
procedure SendButton(AppTitle:String; ButtonText:String);
var hWindow, hButton: HWND;
begin
 hWindow := FindWindow(nil, PChar(AppTitle));
 if hWindow <> 0 then begin
  hButton:= FindWindowEx(hWindow, 0, 'Button', PWideChar(ButtonText));
  if hButton <> 0 then begin
 
   SendMessage(hButton,BM_CLICK, 0, 0);
   sendMessage(hWindow,WM_SYSCOMMAND,SC_MINIMIZE,0);
//   sendMessage(hWindow,WM_SYSCOMMAND,SC_CLOSE, 0)
 
  end else begin end;
 
 end
end;
 
 
// поток обработчика-таймера
procedure Ontmr1(uTimerID, uMessage: uint;dwUser, dw1, dw2: dword) stdcall;
begin
 SendButton('Alarm DB Logger Manager', '&Start');
//showwindow(,sw_hide);
 off:=true;
 
end;
// end УПРАВЛЕНИЕ -------------------------
 
 
// СКЕЛЕТ =================================
procedure timer_create;
begin
 tmr1:= timesetevent(3000, 0, @Ontmr1, 0, 1)
end;
 
procedure timer_destroy;
begin
 timeKillEvent(tmr1)
end;
 
constructor TF.Create;
begin
 inherited Create;
 
 FWnd:= AllocateHWnd(WndProcc);
 // запускаем таймер
 timer_create;
 
end;
 
destructor TF.Destroy;
begin
 inherited;
 
 timer_destroy;
 deAllocateHWnd(fWnd);
end;
 
// отслеживаем перезагрузку и выключение ПК
procedure tf.WndProcc(var Msgs: TMessage);
begin
 case Msgs.Msg of
  WM_QUERYENDSESSION: begin
                       off:= true;
                       t.Destroy;
                       Msgs.Result:= 1
                      end
 end
end;
 
 
 
begin
 // инициализация
 t:= tf.Create;
 
 // ставим бесконечный цикл
 try while (GetMessage(Msg, 0, 0, 0))and(not off) do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg)
 end finally t.destroy end
// END СКЕЛЕТ ============================
 
 
end.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
20.08.2014, 20:15
TC, вот упорно не хотите подумать:
1- код оборачивайте в теги, неудобочитаем.
2- по таймеру бесконечно ищется окно для жмаканья кнопы, но ведь и сворачивание идет постоянно с скрытием, а вам ведь нужно только свернуть окно Alarm DB Logger Manager. Переносим сообщения сворачивания и закрытия нашего приложения в процедуру SendButton().
3- каким образом выйти из бесконечного цикла GetMessage() через сообщения? Правильно, корректно назначить и описать обработчик для AllocateHWnd(), отлавливать WM_QUIT для окна и передать полученный хэндл виртуального окна в GetMessage() вторым параметром.
4- далее, как послать сообщение закрытия нашему виртуальному окну? Правильно, SendMessage(FWnd, WM_QUIT, 0, 0).

Таким образом:
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
program alarmclick;
 
uses Messages, Windows, mmsystem, classes;
 
type
 // класс-обработчик сообщений ситемы
 TF = class
 protected
  constructor Create;
  destructor Destroy; override;
 
  procedure WndProc(var Msg: TMessage);
 end;
 
 
var
  t : tf;
  //
  FWnd: HWnd;
  Msg: tmsg;
  tmr1: cardinal;
  hWindow, hButton: HWND;
 
 
 
procedure SendButton(AppTitle:String; ButtonText:String);
begin
 hWindow := FindWindow(nil, PChar(AppTitle));
 if hWindow <> 0 then begin
  hButton:= FindWindowEx(hWindow, 0, 'Button', PansiChar(ButtonText));
  if hButton <> 0 then begin
 
   // жмакаем кнопу в окне Alarm DB Logger Manager
   SendMessage(hButton,BM_CLICK, 0, 0);
 
   // сворачиваем окно Alarm DB Logger Manager
   sendMessage(hWindow, WM_SYSCOMMAND, SC_MINIMIZE, 0);
 
   // завершаем наше приложение
   SendMessage(FWnd, WM_QUIT, 0, 0);
  end else begin end;
 
 end
end;
 
 
// поток обработчика-таймера
procedure Ontmr1(uTimerID, uMessage: uint;dwUser, dw1, dw2: dword) stdcall;
begin
 SendButton('Alarm DB Logger Manager', '&Start');
end;
// end УПРАВЛЕНИЕ -------------------------
 
procedure tf.WndProc(var Msg: TMessage);
begin
 case Msg.msg of
  WM_QUIT: begin // отлавливаем сообщение о завершении приложения
            PostQuitMessage(0);
            t.Destroy;
           end;
 
  else Msg.result:= defwindowproc(FWnd, Msg.Msg, Msg.WParam, Msg.LParam);
 end;
end;
 
constructor TF.Create;
begin
 inherited Create;
 
 FWnd:= AllocateHWnd(WndProc);
 // запускаем таймер
 tmr1:= timesetevent(1000, 0, @Ontmr1, 0, 1)
end;
 
destructor TF.Destroy;
begin
 inherited;
 
 timeKillEvent(tmr1);
 deAllocateHWnd(FWnd);
end;
// СКЕЛЕТ =================================
 
 
begin
 // инициализация
 t:= tf.Create;
 
 // ставим бесконечный цикл
 while GetMessage(Msg, FWnd, 0, 0) do begin
  TranslateMessage(Msg);
  DispatchMessage(Msg)
 end;
 
// END СКЕЛЕТ ============================
 
 
end.
0
3 / 3 / 1
Регистрация: 05.04.2010
Сообщений: 84
21.08.2014, 08:43  [ТС]
Да господи, этот код теперь вообще не нажимает кнопку Старт и не сворачивает(((
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
21.08.2014, 10:00
...тестировать не на чем, но подозреваю дело в отсутствии задержек между сообщениями (хотя SendMessage это и так с ожиданием ответа). Попробуйте так:
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
var p: boolean = false;
i: integer = 0;
 
procedure SendButton(AppTitle:String; ButtonText:String);
begin
 hWindow := FindWindow(nil, PChar(AppTitle));
 if hWindow <> 0 then begin
  hButton:= FindWindowEx(hWindow, 0, 'Button', PansiChar(ButtonText));
  if hButton <> 0 then begin
 
   // жмакаем кнопу в окне Alarm DB Logger Manager
   SendMessage(hButton,BM_CLICK, 0, 0);
   p:= true;
   
  end else begin end;
 
 end
end;
 
 
// поток обработчика-таймера
procedure Ontmr1(uTimerID, uMessage: uint;dwUser, dw1, dw2: dword) stdcall;
begin
 SendButton('Alarm DB Logger Manager', '&Start');
 if p then begin
  if i = 1 then
   // сворачиваем окно Alarm DB Logger Manager
   sendMessage(hWindow, WM_SYSCOMMAND, SC_MINIMIZE, 0);
  if i = 2 then
   // завершаем наше приложение
   SendMessage(FWnd, WM_QUIT, 0, 0);
  inc(i);
 end
end;
Добавлено через 6 минут
...кстати, а после нажатия на кнопку "Start" это окно с этой же кнопкой остается разве? Если нет и появляется другое окно, то и посылать сообщение нужно другому окну. Так как?

Добавлено через 8 минут
...и да, а вы случаем не путаете сворачивание окна и скрытие? Потому что, если нужно его скрыть, то тогда шлите просто showwindow(hWindow, sw_hide).
0
3 / 3 / 1
Регистрация: 05.04.2010
Сообщений: 84
21.08.2014, 12:31  [ТС]
Да после нажатия старт оно остается, вот я и хочу его сворачивать после того как Alarm DB Logger Manager стартанет.
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
21.08.2014, 12:49
...напомню вам две вещи:
1- прочитайте наконец ман и используйте сервис вместо велосипедов
2- используйте showwindow(hWindow, sw_hide).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.08.2014, 12:49

Как через Enter нажать на кнопку
Ребят, помогите с такой задачкой: Допустим на форме 2 Button'a (button №1 и баттон №2). Задача: Нажать на Button №1 кнопкой Enter. ...

Перехват ошибок стороннего приложения
Вечер добрый! Имеется некое приложение, которое при запуске может выдавать ошибки(скорее всего они обрабатываются внутри). Можно ли...

Получение информации из стороннего приложения
Доброго времени суток Уважаемому сообществу! Выручайте! Есть прога написанная прошлым кодером, исходники не сохранились, есть в этой...

Ввод информации в текстовые поля стороннего приложения
Здравствуйте уважаемые форумчане! Столкнулся с такой проблемкой: Нужно в чужом приложении(написанном на PowerBilder) найти...

Нажать на кнопку стороннего приложения программно
Здравствуйте. Как нажать на кнопку стороннего приложения если есть адрес


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru