|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.02.2017, 19:00 | #1 |
Пользователь
Регистрация: 27.02.2017
Сообщений: 28
|
Как нажать на кнопку в модальной форме чужого приложения?
Всем привет! В Borland 6 C++ пишу программу, используя функции WinApi, которая управляет чужой программой (навигация по меню, нажимает кнопки). В определенном месте нажимается кнопка, которая запускает модальную форму. На этом я и застрял. Мне нужно на той модальной форме нажать клавишу. А как я понимаю, мой процесс застыл с открытием этой формы (нужно вручную щелкнуть, чтобы продолжился). Подскажите, как это сделать программно?
|
28.02.2017, 08:32 | #2 |
Форумчанин
Регистрация: 31.05.2009
Сообщений: 786
|
Нужно послать этому модальному окну сообщение WM_COMMAND c правильно сформированными wParam и lParam.
wParam Старшее слово определяет код предупреждения, если это сообщение от органа управления. Если сообщение от клавиши - ускорителя, этот параметр равен 1. Если сообщение от меню, этот параметр 0. Младшее слово определяет идентификатор кнопки. lParam Дескриптор (HWND) кнопки. |
28.02.2017, 22:25 | #3 |
Пользователь
Регистрация: 27.02.2017
Сообщений: 28
|
Спасибо, такого варианта я еще не рассматривал. Буду осваивать.
|
28.02.2017, 22:32 | #4 |
Пользователь
Регистрация: 27.02.2017
Сообщений: 28
|
Секундочку... Может быть я что-то не понимаю. Как я найду хэндл кнопки, если вызов этого окна заморозит мой процесс?
|
28.02.2017, 23:22 | #5 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,330
|
Что, по вашему, значит "вызов окна" и "заморозит процесс", да еще в одном предложении...
|
01.03.2017, 01:22 | #6 | |
мальчик-помогай =)
Форумчанин
Регистрация: 16.09.2010
Сообщений: 522
|
Цитата:
Покажи основные части своего кода и будет проще подсказать. |
|
01.03.2017, 07:00 | #7 |
Пользователь
Регистрация: 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); |
01.03.2017, 08:13 | #8 |
Форумчанин
Регистрация: 31.05.2009
Сообщений: 786
|
https://msdn.microsoft.com/ru-ru/lib...ms645481.aspx\
Здесь hDlg - хендл диалога, чтобы его получить, нужно курить в гугле поиск окна по имени. nIDDlgItem - ID кнопки, всегда постоянен. Чтобы его получить, нужно проявить смекалку. Например, используя Spy++ определить текущие hwnd диалогового окна и кнопки и вызвать GetDlgItemInt |
01.03.2017, 15:25 | #9 |
мальчик-помогай =)
Форумчанин
Регистрация: 16.09.2010
Сообщений: 522
|
ну так добавь ожидание\поиск модального окна и нажимай там кнопку, а потом продолжай работу с основным окном
|
01.03.2017, 18:26 | #10 | |
Пользователь
Регистрация: 27.02.2017
Сообщений: 28
|
Цитата:
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", т.к. поиск хэндла происходил после того, как диалог был закрыт вручную |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как автоматически нажать кнопку? | 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 |