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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2017, 18:49   #11
AlexAES
Пользователь
 
Регистрация: 27.02.2017
Сообщений: 28
По умолчанию

Цитата:
Сообщение от alexcoder Посмотреть сообщение
https://msdn.microsoft.com/ru-ru/lib...ms645481.aspx\
Здесь hDlg - хендл диалога, чтобы его получить, нужно курить в гугле поиск окна по имени.
nIDDlgItem - ID кнопки, всегда постоянен. Чтобы его получить, нужно проявить смекалку. Например, используя Spy++ определить текущие hwnd диалогового окна и кнопки и вызвать GetDlgItemInt
Я боюсь, до поиска хэндла диалога дело тоже не дойдет, пока не закроешь окно. Почему мой процесс зависает?
AlexAES вне форума Ответить с цитированием
Старый 01.03.2017, 19:31   #12
AlexAES
Пользователь
 
Регистрация: 27.02.2017
Сообщений: 28
По умолчанию

Цитата:
Сообщение от GreenWizard Посмотреть сообщение
ну так добавь ожидание\поиск модального окна и нажимай там кнопку, а потом продолжай работу с основным окном
А поподробней про ожидание можно??? Что-то мне подсказывает,что в этом дело
AlexAES вне форума Ответить с цитированием
Старый 01.03.2017, 19:57   #13
AlexAES
Пользователь
 
Регистрация: 27.02.2017
Сообщений: 28
По умолчанию

Т.е. при открытии модальной формы мое приложение зависает. И пока не нажмешь на кнопку в модальной форме, продолжать дальше выполнять инструкции оно не будет. Чего-то где-то какой-то косяк. Посмотрите, пожалуйста, код приведен в теме
AlexAES вне форума Ответить с цитированием
Старый 01.03.2017, 19:58   #14
AlexAES
Пользователь
 
Регистрация: 27.02.2017
Сообщений: 28
По умолчанию

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

1) на форуме есть тег CODE... будь добр, используй его.
2) всем будет проще (тебе, в первую очередь) если ты разобьёшь код на функции... в частности, выдели поиск окна по заголовку и это уже упростит проблему т. к. сейчас я вижу что, например, поиск начинается не с первого окна (что вовсе, как оказалось, GetWindow(0, GW_HWNDFIRST) ), а с рандомного и тебе очень повезло, что оно не стопорится в самом начале..... не факт, что это единственная ошибка
3) модальное окно появляется не моментально, поэтому либо повторяй поиск снова и снова, либо добавь задержку в 2-3сек перед поиском (что потом выльется абсолютно непредсказуемые сбои)

Последний раз редактировалось GreenWizard; 01.03.2017 в 20:35.
GreenWizard вне форума Ответить с цитированием
Старый 01.03.2017, 21:43   #16
AlexAES
Пользователь
 
Регистрация: 27.02.2017
Сообщений: 28
По умолчанию

Ну вот как-то так понагляднее будет. Поиск хэндлов теперь начинается не с рандомного. И сделал задержку перед поиском хэндла модальной формы

Код:
#include <iostream>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
HWND HForm, HmyForm, HPanel,H_OWL,H_Tab,Hreg, H_otm,HPage, HTabSh, HndBtn, HndTree,H1, hItem, hItem_EO, hItem_SH, hItem_Parma;
char Pch[128];
char Reg[128];
HForm=GetWindow(FindWindow(0,"Form1"), GW_HWNDFIRST);

 //----------------поиск хэндлов компонентов-------------------
 do
  {
   HForm=GetNextWindow(HForm,GW_HWNDNEXT); //хэндл формы
   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_Window",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,"SysTreeView32",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
 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,"Button","Установить соединение");
 SendMessage(HndBtn,BM_CLICK,0,0);

 //-------------попытка найти хэндл модального окна-------------------
  Sleep(2000);
  Hreg=GetWindow(HForm, GW_HWNDFIRST);
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);

 }
AlexAES вне форума Ответить с цитированием
Старый 01.03.2017, 22:43   #17
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Возьми тот же WinSpy и посмотри более подробно данные модального окна.
Ещё может быть такое, что там Unicode и нужно сравнивать строки чуть иначе (WideCompareText?)
GreenWizard вне форума Ответить с цитированием
Старый 01.03.2017, 23:06   #18
AlexAES
Пользователь
 
Регистрация: 27.02.2017
Сообщений: 28
По умолчанию

Не знаю, может поможет это как-то. Если процедуру отыскания модального окна и нажатия клавиши в нем произвести отдельно, то все получается. Т.е. если я вручную в стороннем приложении нажму кнопку "Установить соединение", вызовется модальное окно и затем запущу свою отдельную процедуру, то кнопка в нем нажмется. Вот так:
Код:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
 char Reg[128]={0};
 HWND Hreg=GetWindow(FindWindow(0,"Form1"), GW_HWNDFIRST);
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";

  HWND H_otm=FindWindowEx(Hreg,0,"Button","Отмена");
  Sleep(5000);
  SendMessage(H_otm,BM_CLICK,0,0);
}
AlexAES вне форума Ответить с цитированием
Старый 01.03.2017, 23:27   #19
AlexAES
Пользователь
 
Регистрация: 27.02.2017
Сообщений: 28
По умолчанию

Т.е. все хэндлы, связанные с этим окном, правильно определяются. В Диспетчере задач после того, как выскакивает модальная форма, мое приложение в статусе "Не отвечает". После нажатия вручную кнопки "Работает"
AlexAES вне форума Ответить с цитированием
Старый 01.03.2017, 23:28   #20
GreenWizard
мальчик-помогай =)
Форумчанин
 
Регистрация: 16.09.2010
Сообщений: 522
По умолчанию

Цитата:
Сообщение от AlexAES Посмотреть сообщение
//-------------попытка найти хэндл модального окна------------------- Sleep(2000); Hreg=GetWindow(HForm, GW_HWNDFIRST);
попробуй тогда уж 20 000.... может за 2сек не успевает
и это точно чужой процесс\приложение, а др. окно твоего же?
GreenWizard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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