Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2017, 19:00   #1
AlexAES
Пользователь
 
Регистрация: 27.02.2017
Сообщений: 28
По умолчанию Как нажать на кнопку в модальной форме чужого приложения?

Всем привет! В Borland 6 C++ пишу программу, используя функции WinApi, которая управляет чужой программой (навигация по меню, нажимает кнопки). В определенном месте нажимается кнопка, которая запускает модальную форму. На этом я и застрял. Мне нужно на той модальной форме нажать клавишу. А как я понимаю, мой процесс застыл с открытием этой формы (нужно вручную щелкнуть, чтобы продолжился). Подскажите, как это сделать программно?
AlexAES вне форума Ответить с цитированием
Старый 28.02.2017, 08:32   #2
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Нужно послать этому модальному окну сообщение WM_COMMAND c правильно сформированными wParam и lParam.

wParam
Старшее слово определяет код предупреждения, если это сообщение от органа управления. Если сообщение от клавиши - ускорителя, этот параметр равен 1. Если сообщение от меню, этот параметр 0.

Младшее слово определяет идентификатор кнопки.

lParam
Дескриптор (HWND) кнопки.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 28.02.2017, 22:25   #3
AlexAES
Пользователь
 
Регистрация: 27.02.2017
Сообщений: 28
По умолчанию

Спасибо, такого варианта я еще не рассматривал. Буду осваивать.
AlexAES вне форума Ответить с цитированием
Старый 28.02.2017, 22:32   #4
AlexAES
Пользователь
 
Регистрация: 27.02.2017
Сообщений: 28
По умолчанию

Секундочку... Может быть я что-то не понимаю. Как я найду хэндл кнопки, если вызов этого окна заморозит мой процесс?
AlexAES вне форума Ответить с цитированием
Старый 28.02.2017, 23:22   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Что, по вашему, значит "вызов окна" и "заморозит процесс", да еще в одном предложении...
waleri вне форума Ответить с цитированием
Старый 01.03.2017, 01:22   #6
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от AlexAES Посмотреть сообщение
Секундочку... Может быть я что-то не понимаю. Как я найду хэндл кнопки, если вызов этого окна заморозит мой процесс?
Процесс же чужой и не заморозит твой..... другое дело что ты сам мог написать, мол, ничего не знаю и ждать до победного
Покажи основные части своего кода и будет проще подсказать.
GreenWizard вне форума Ответить с цитированием
Старый 01.03.2017, 07:00   #7
AlexAES
Пользователь
 
Регистрация: 27.02.2017
Сообщений: 28
По умолчанию

Вот такой код. Наверное какую-то проверку надо делать, как сказал последний товарищ...


HWND HForm=Handle, HPanel,H_OWL,H_Tab,H_reg=Handle, H_otm,HPage, HTabSh, HndBtn, HndTree,H1, hItem, hItem_EO, hItem_SH, hItem_Parma;
char Pch[128];
char Reg[128];
do
{
HForm=GetNextWindow(HForm,GW_HWNDNE XT); //хэндл формы
GetWindowText(HForm,Pch,128);
if(CompareText(Pch,"DoCtrl")==0)
break;
}
while (HForm!=NULL);
if(HForm!=NULL)
Edit2->Text="HForm -норм";
else
Edit2->Text="HForm =0";
SetForegroundWindow(HForm);

H_OWL=FindWindowEx(HForm,0,"OWL_Win dow",NULL); //хэндл какого-то //1-го дочернего компонента =)
if(H_OWL!=NULL)
Edit3->Text="H_OWL -норм";
else
Edit3->Text="H_OWL =0";

HTabSh=FindWindowEx(H_OWL,0,"#32770 ","Объекты"); //хэндл вкладки
if(HTabSh!=NULL)
Edit4->Text="HTabSh -норм";
else
Edit4->Text="HTabSh =0";

HndTree=FindWindowEx(HTabSh,0,"SysT reeView32",NULL); //хэндл //TreeView
if(HndTree!=NULL)
Edit5->Text="HndTree -норм";
else
Edit5->Text="HndTree =0";
SetForegroundWindow(HndTree);

//-------здесь нажимаются узлы в TreeView-----------------

hItem_EO = (HTREEITEM) SendMessage(HndTree, TVM_GETNEXTITEM, TVGN_ROOT, NULL); //хэндл Энергообъекты
SendMessage(HndTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM) hItem_EO);

hItem_SH = (HTREEITEM) SendMessage(HndTree, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM) hItem_EO); //хэндл ШСБ-1
// Sleep(1000);
SendMessage(HndTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM) hItem_SH);

hItem_Parma = (HTREEITEM) SendMessage(HndTree, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM) hItem_SH); //хэндл Парма-1
SendMessage(HndTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM) hItem_Parma);

HndBtn=FindWindowEx(HTabSh,0,"Butto n","Установить соединение");
SendMessage(HndBtn,BM_CLICK,0,0);

//--здесь выскакивает модальное окно и мое прил. зависает, пока не нажмешь вручную кнопку-------

hItem_Parma = (HTREEITEM) SendMessage(HndTree, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM) hItem_Parma); //хэндл Парма-2
SendMessage(HndTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM) hItem_Parma);
AlexAES вне форума Ответить с цитированием
Старый 01.03.2017, 08:13   #8
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Цитата:
Сообщение от AlexAES Посмотреть сообщение
Как я найду хэндл кнопки
https://msdn.microsoft.com/ru-ru/lib...ms645481.aspx\
Здесь hDlg - хендл диалога, чтобы его получить, нужно курить в гугле поиск окна по имени.
nIDDlgItem - ID кнопки, всегда постоянен. Чтобы его получить, нужно проявить смекалку. Например, используя Spy++ определить текущие hwnd диалогового окна и кнопки и вызвать GetDlgItemInt
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 01.03.2017, 15:25   #9
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от AlexAES Посмотреть сообщение
HndBtn=FindWindowEx(HTabSh,0,"Butto n","Установить соединение");
SendMessage(HndBtn,BM_CLICK,0,0);

//--здесь выскакивает модальное окно и мое прил. зависает, пока не нажмешь вручную кнопку-------
ну так добавь ожидание\поиск модального окна и нажимай там кнопку, а потом продолжай работу с основным окном
GreenWizard вне форума Ответить с цитированием
Старый 01.03.2017, 18:26   #10
AlexAES
Пользователь
 
Регистрация: 27.02.2017
Сообщений: 28
По умолчанию

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
ну так добавь ожидание\поиск модального окна и нажимай там кнопку, а потом продолжай работу с основным окном
После того, как появляется диалог, вставлял такой код:

do
{
Hreg=GetNextWindow(Hreg,GW_HWNDNEXT );
GetWindowText(Hreg,Reg,sizeof(Reg)) ;
if(CompareText(Reg,"Регистрация")== 0)
break;
}
while (Hreg!=NULL);
if(Hreg!=NULL)
Edit7->Text="Hreg -найден";
else
Edit7->Text="Hreg =0";

H_otm=FindWindowEx(Hreg,0,"Button", "OK");
Sleep(2000);
SendMessage(H_otm,BM_CLICK,0,0);

Но до него дело не доходит. Мой процесс зависает, пока не нажмешь в диалоге кнопку мышью. И в итоге в Edit7 появляется надпись "Hreg =0", т.к. поиск хэндла происходил после того, как диалог был закрыт вручную
AlexAES вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как автоматически нажать кнопку? artem611 C# (си шарп) 6 11.03.2013 00:56
Нажать кнопку на форме Excel furie1 C# (си шарп) 0 15.04.2012 23:08
Как нажать на кнопку в программе. arach Win Api 6 07.09.2010 19:50
Как нажать кнопку другого приложения? TwiX Общие вопросы Delphi 2 29.07.2009 19:08