(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
Kaspersky Endpoint Security для бизнеса – Стандартный Russian Edition. 10-14 Node 1 year Base License
Traffic Inspector GOLD 5 Учетных записей
Business Studio 4.2 Enterprise. Конкурентная лицензия + Business Studio Portal 4.2. Пользовательская именная лицензия.
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
eManual - электронные книги и техническая документация
Adobe Photoshop: алхимия дизайна
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100