Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/48: Рейтинг темы: голосов - 48, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 16.01.2013
Сообщений: 34
1

Нажатие кнопки в другом окне

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

Author24 — интернет-сервис помощи студентам
Нужно сделать нажатие кнопки в другом окне, например: запускаеш программу, запускаеш калькулятор, Моя программа свёрнута, через какое то время на калькуляторе по таймеру нажимается например 1.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2013, 23:14
Ответы с готовыми решениями:

Нажатие клавиши в другом окне
Скажите как можно нажать клавишу например 8 в окне, например калькулятора. При том что оно свернуто...

Нажатие кнопки в окне открытой программы другой программой
Здравствуйте. Имею следующую задачу. Необходимо запустить внешнюю программу и с определённой...

Нажатие кнопки "Подключить" на окне удаленного рабочего стола
Помогите пожалуйста разобраться нужно программно нажать кнопку "Подключить" на окне удаленного...

Нажатие кнопки приводит к изменению цвета формы и заголовка кнопки
Помогите пожалуйста так сделать : "Нажатие кнопки приводит к изменению цвета формы на синий, а...

11
LK
Заблокирован
28.02.2013, 23:42 2
идете сюда:
Библиотека VCL и сопутствующие материалы
и читаете про "мечты вуайериста"
0
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 10
05.05.2014, 00:59 3
Пробую эмулировать нажатия клавиш в другой программе. Тестировал на примере калькулятора. Но созданный код не работает.
Код
    Sleep(3000);
    HWND SubjectWindow = FindWindowA(NULL,"Калькулятор");
    HANDLE hwnd=FindWindowEx(SubjectWindow, NULL, "Edit", NULL);
    SendMessage(hwnd, WM_CHAR, 5 , 0);
    PostMessage(hwnd,WM_KEYDOWN,6,0);
    PostMessage(hwnd,WM_KEYUP,6,0);
Кто-то может подсказать причину неработоспособности кода?
0
случайный прохожий
3021 / 2048 / 623
Регистрация: 20.07.2013
Сообщений: 5,501
05.05.2014, 01:23 4
Не устану повторять - программы типа WinSpy в помощь.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
HWND NextWindowElement(HWND h, LPCTSTR fasdClass, LPCTSTR fasdWindow, int level)
{
  HWND h2 = NULL;
  for(int i = 0; i < level; i++)
  {
    h2 = FindWindowEx(h, h2, fasdClass, fasdWindow);
  }
  return h2;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button14Click(TObject *Sender)
{
  HWND hWnd = FindWindow("SkinDialog", "Garena LAN Game");
  HWND hWnd2 = NextWindowElement(hWnd, "#32770", NULL, 3);
  HWND hWnd3 = NextWindowElement(hWnd2, "Button", NULL, 34);
  SendMessage(hWnd3, WM_LBUTTONDOWN, 0, 0);
  SendMessage(hWnd3, WM_LBUTTONUP, 0, 0);
//  пуск
}
P.S.: иногда требуется "запуск подобного кода" от имени администратора (зависит от приложения, в которое "пытаемся влезть").
Миниатюры
Нажатие кнопки в другом окне  
1
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 10
05.05.2014, 14:44 5
gunslinger, установил WinSpy++ по вашей рекомендации, и немного продвинулся в решении своей задачи, но цели так и не достиг.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    
    Sleep(3000);
    HWND pHandle;
    pHandle=FindWindow(NULL,"Калькулятор");
    SetWindowText(pHandle, "Окно захвачено");   //для проверки - работает
    HWND hwnd=(void *)0x000A07A4; // строка, в которой отображается набранное число - из WinSpy++
    HWND hwnd=FindWindowEx(pHandle, NULL, "Static", NULL); // пробовал и этот вариант
    SendMessage(hwnd, WM_CHAR, 5 , 0); // не работает
    PostMessage(hwnd,WM_KEYDOWN,6,0); // не работает
    PostMessage(hwnd,WM_KEYUP,6,0); // не работает
 
    hwnd=(void *)0x00070680; // адрес кнопки с цифрой - из WinSpy++
    SendMessage(hwnd, WM_LBUTTONDOWN, 0, 0); // работает!
    SendMessage(hwnd, WM_LBUTTONUP, 0, 0); // работает!
    SendMessage(hwnd, WM_LBUTTONDOWN, 0, 0); // работает!
    SendMessage(hwnd, WM_LBUTTONUP, 0, 0); // работает!
    hwnd=(void *)0x001102E2; // адрес другой кнопки с цифрой - из WinSpy++
    SendMessage(hwnd, WM_LBUTTONDOWN, 0, 0); // работает!
    SendMessage(hwnd, WM_LBUTTONUP, 0, 0); // работает!
 
    SendMessage(hwnd, WM_CHAR, 5 , 0); // здесь также не работает
    PostMessage(hwnd,WM_KEYDOWN,6,0); // здесь также не работает
    PostMessage(hwnd,WM_KEYUP,6,0); // здесь также не работает
Таким образом, окно захватить смог, заголовок окна изменил, понажимал по кнопкам, но эмулировать нажатия клавиш на клавиатуре так и не получается... Что не так?
0
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
05.05.2014, 15:32 6
C++
1
2
3
HWND pHandle;
pHandle=FindWindow(NULL,"Калькулятор");
PostMessage(pHandle, WM_KEYDOWN, '5', 0);
Добавлено через 3 минуты
Цитата Сообщение от Yulick Посмотреть сообщение
C++
1
hwnd=(void *)0x00070680; // адрес кнопки с цифрой - из WinSpy++
после перезапуска калькулятора этот адресс будет другой, не стоит на него опиратся
1
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 10
05.05.2014, 19:34 7
_Dimon_, Спасибо за помощь!
Цитата Сообщение от _Dimon_ Посмотреть сообщение
после перезапуска калькулятора этот адресс будет другой, не стоит на него опиратся
я знаю, использовал только для тестирования

Добавлено через 17 минут
А как получить HWND у процесса, созданного через CreateProcess ?

C++
1
CreateProcess(NULL, szCmdline, NULL, NULL, 0, 0, NULL, NULL, &si, &pi);
pi.hProcess - Дескриптор процесса
pi.dwProcessId - Идентификатор процесса

а как получить хэндл?

Добавлено через 41 минуту
Словом, мне надо запустить программу и нажать в ней Ф3
думал что-то типа того
C++
1
2
3
         CreateProcess(NULL, szCmdline, NULL, NULL, 0, 0, NULL, NULL, &si, &pi);
         pH = pi.hProcess; // èëè hThread ?
         PostMessage(pH, WM_KEYDOWN, VK_F3, 0);
или это
C++
1
2
3
         CreateProcess(NULL, szCmdline, NULL, NULL, 0, 0, NULL, NULL, &si, &pi);
         pH = FindWindow(NULL, si.lpTitle);
         PostMessage(pH, WM_KEYDOWN, VK_F3, 0);
но ничено не работает...
кто-то сможет помочь?
0
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
06.05.2014, 01:47 8
Цитата Сообщение от Yulick Посмотреть сообщение
А как получить HWND у процесса, созданного через CreateProcess ?
да так же, через FindWindow
надо знать как программа называется или класс перехватываемого окна
1
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 10
06.05.2014, 13:47 9
Цитата Сообщение от _Dimon_ Посмотреть сообщение
надо знать как программа называется ...
это понятно
C++
1
hwnd = FindWindow(NULL, "Название программы");
Цитата Сообщение от _Dimon_ Посмотреть сообщение
надо знать ... класс перехватываемого окна
а это как?
0
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
06.05.2014, 15:14 10
Цитата Сообщение от Yulick Посмотреть сообщение
а это как?
это так
C++
1
hwnd = FindWindow("CalcFrame", NULL /*а можно и название вписать*/);
1
0 / 0 / 0
Регистрация: 05.05.2014
Сообщений: 10
06.05.2014, 18:16 11
_Dimon_, спасибо!
0
2 / 2 / 0
Регистрация: 05.11.2016
Сообщений: 22
31.03.2018, 20:36 12
keydown - событие клавиатуры
А то, что работает - событие мышки
0
31.03.2018, 20:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2018, 20:36
Помогаю со студенческими работами здесь

Программа эмулирует нажатие клавиш клавиатуры в неактивном окне
Всем привет! Требуется написать программу которая эмулирует нажатие клавиш клавиатуры в неактивном...

Нажатие кнопки
Суть программы такова. На форме есть одна кнопка, мне надо сделать что б кнопка срабатывала при...

Нажатие кнопки в С++ Builder
Здраствуйте. На форме имеется две кнопки Button . При нажатие первой выполняется какое то действие....

Поймать нажатие кнопки
Доброго времени суток!!! Приложение просто висит в процессах, видимых форм у него нет... Как в...


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

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