(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Управление чужим приложением средствами WinAPI

Источник: delphikingdom
Александр Тустановский

 
Просмотрев в королевстве на данную тему множество вопросов, оставшихся без ответов, сам нашел решение проблемы управления чужим приложением.
Данный код ищет чужое приложение,запускает в нем 2 пункт 7 подпункт меню, в появившемся диалоге выбора файла ищет класс Edit c текстом '', вводит в класс Edit строку с именем файла и отсылает команду Enter. Далее ищет появление диалогового окна с предложением подтвердить загрузку. После ищет кнопку "Да" и отсылает команду Enter.

Напомню, что все диалоговые окна - это главные окна, которые ищутся FindWindow, а всякие Edit,Button,ComboBox и т.д. - это дочерние окна, которые ищутся функцией FindWindowEx.

procedure TForm1.Button9Click(Sender: TObject);
Var
Men      :HMenu;
Hnd,HndDialog,HndControl,HndAsc,HndBtn  :HWnd;
HndMen,HndSMen                          :HMenu;
StrClass                                :PChar;
StrBase                                 :string;
IdBtn,idMen                             :integer;
begin
  Hnd:=FindWindow(nil, 'Конфигуратор - 2345');
  if Hnd <>0 then begin
    //фокусируем: 
    windows.SetForegroundWindow(Hnd);   //или можно так:windows.BringWindowToTop(Hnd);
//Работа с меню:
//===============================================================================
    HndMen:=GetMenu(Hnd);//получили описатель главного меню окна.

    HndSMen:=GetSubMenu(HndMen,1);//получили описатель второго пункта главного меню (0 -первый пункт)
    //получили идентификатор 7 пункта подменюменю (черты в меню - это также пункты)	
    idMen:=GetMenuItemID(HndSMen,6);
    //в данном случае idMen это word(33206)
    if idMen<>0 then begin										   
	//запускаем пункт меню. Именно PostMessage, SendMessage - не работает.
      PostMessage(Hnd,WM_COMMAND,idMen,0); 
	  

  //===============================================================================
  //Инициализируем переменные диалогов:
      HndDialog:=0;
      HndControl:=0;
      HndBtn:=0;
      HndAsc:=0;
      IdBtn:=0;
  //===============================================================================
  //поищем диалог ввода до тех пор пока не найдем:
      While HndDialog=0 do HndDialog:= FindWindow(nil, 'Открыть файл конфигурации');
        if HndDialog<>0 then begin
           StrClass:='Edit'+#0;//на всякий случай вставим завершающий ноль
           //Ищем класс Edit среди подчиненных HndDialog окон
           HndControl:=FindWindowEx(HndDialog,0,StrClass,'');
           if HndControl<>0 then begin
             StrBase:='D:\md\zik2345\1Cv7.MD';
             Sleep(1000);//а вот без этого ну ни как не хочет работать.

             SendMessage(HndControl, WM_Settext,0,Integer(StrBase));//все, текст переменной StrBase введен.
             //жмем Enter
             SendMessage(HndDialog,WM_Command,MakeWParam(1,$0f),HndControl);
             //здесь 1 это значит что мы передаем на выполнение акселератор
             //строки, а $0f - это событие "(Enter)" этому акселератору
             //в MSDN смотрим WM_Command.
             //MakeWParam - функция которая два Word слова помещает :
             //первое в верхние 16 bit, второе в нижние 16 bit, 32 битного(LongInt) 
			 //параметра WParam (аналог MakeLParam ).
  //===============================================================================
  //ищем диалог пока не найдем:
             while HndAsc=0 do HndAsc:= FindWindow(nil, 'Конфигуратор');
             if HndAsc<>0 then begin
  //ищем кнопку в диалоге:
  //обращаем внимание на знак & - если на кнопку завязана комбинация клавиш 
  //(это когда буква в кнопке подчеркнута) 
  //то надо к имени добавлять перед этой буквой & а то кнопочка не найдется если их несколько.

                 while HndBtn=0 do HndBtn:=FindWindowEx(HndAsc,0,'Button','&Да');
                 if HndBtn<>0 then begin
                 IdBtn:=GetDlgCtrlID(HndBtn);
                    if IdBtn<>0 then begin
                     //ну и наконец жмем кнопку '&Да':
                     SendMessage(HndAsc,WM_Command,MakeWParam(IdBtn,BN_CLICKED),HndBtn);
                     //а хелп MSDN по BN_CLICKED или WM_Command
                     //здесь верхнее слово WParam это идентификатор контрола, а нижнее - код BN_CLICKED
                    end;
                 end;
             end;

  //================================================================================
           end;
        end;
    end;
  end;
end;

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 22.06.2009 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Enterprise Connectors (1 Year term)
Delphi Professional Named User
VMware Fusion 10 Pro, ESD
Stimulsoft Reports.Ultimate Single License Includes one year subscription, source code
Купить Антивирус Dr.Web Server Security Suite для сервера
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
Реестр Windows. Секреты работы на компьютере
СУБД Oracle "с нуля"
Компьютерные книги. Рецензии и отзывы
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100