Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Управление меню другим прилодением, как программно у другова прил. кликнуть 
:(
    Опции темы
andrey_post
  Дата 30.9.2004, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 23.12.2003
Где: Екатеринбург

Репутация: нет
Всего: нет



Есть приложение в котором надо нажимать в ручную пункт меню и в появившемся окне нажимать на кнопку.
как это зделать программно, что бы мой прога через каждые 30 секунд сама вызывала нужный пункт меню и в появившемся окне нажимала на кнопку?

К примеру, что бы делала такое:
Имя главного окна "Global Mail"
Файл -> Импорт->Выборочный импорт->(Появляется окно с заголовком "Выборочный импорт")-> нажать на нопку "Начать"

Это сообщение отредактировал(а) andrey_post - 30.9.2004, 08:54
--------------------
И что бы там не происходило, не стоит воспринимать жизнь слишком всерьёз, всё равно нам из неё живыми не выбраться!!!
PM MAIL WWW ICQ   Вверх
andrey_post
Дата 30.9.2004, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 23.12.2003
Где: Екатеринбург

Репутация: нет
Всего: нет



Ребята, ну кто то же уже об этом говорил. я помню что в форуме была подобная тема, только не могу ее найти. Хелп ПЛИЗ!!!!!! sample.gif
Сначала решил найти само окно. Использвал вот такой код:
Код

            type
              PFindWindowStruct = ^TFindWindowStruct;
              TFindWindowStruct = record
                Caption : string;
                ClassName : string;
                WindowHandle : THandle;
              end;

            function EnumWindowsProc(hWindow : hWnd;
                                     lParam  : LongInt) : Bool
            {$IFDEF Win32} stdcall; {$ELSE}; export; {$ENDIF}
            var
              lpBuffer : PChar;
              WindowCaptionFound : bool;
              ClassNameFound : bool;

            begin
              GetMem(lpBuffer, 255);
              Result := True;
              WindowCaptionFound := False;
              ClassNameFound := False;

              try
                if GetWindowText(hWindow, lpBuffer, 255) > 0 then
                  if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0
                   then WindowCaptionFound := true;

                if PFindWindowStruct(lParam).ClassName = '' then
                  ClassNameFound := True else
                    if GetClassName(hWindow, lpBuffer, 255) > 0 then
                      if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer))
                       > 0 then ClassNameFound := True;

                if (WindowCaptionFound and ClassNameFound) then begin
                  PFindWindowStruct(lParam).WindowHandle := hWindow;
                  Result := False;
                end;

              finally
                FreeMem(lpBuffer, sizeof(lpBuffer^));
              end;
            end;

            function FindAWindow(Caption : string;
                                 ClassName : string) : THandle;
            var
              WindowInfo : TFindWindowStruct;

            begin
              with WindowInfo do begin
                Caption := Caption;
                ClassName := ClassName;
                WindowHandle := 0;
                EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
                FindAWindow := WindowHandle;
              end;
            end;

            procedure TForm1.Button1Click(Sender: TObject);
            var
              TheWindowHandle : THandle;
            begin
              TheWindowHandle := FindAWindow('Global Mail', '');
              if TheWindowHandle = 0 then
                ShowMessage('Window Not Found!') else
                BringWindowToTop(TheWindowHandle);
            end;


При нажатии на кнопку не находит такое окно, хотя приложение запущено sad.gif

Это сообщение отредактировал(а) andrey_post - 30.9.2004, 13:22
--------------------
И что бы там не происходило, не стоит воспринимать жизнь слишком всерьёз, всё равно нам из неё живыми не выбраться!!!
PM MAIL WWW ICQ   Вверх
Akella
Дата 30.9.2004, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Цитата
При нажатии на кнопку не находит такое окно, хотя приложение запущено

Не забывай про высоту символов
PM MAIL   Вверх
andrey_post
Дата 30.9.2004, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 23.12.2003
Где: Екатеринбург

Репутация: нет
Всего: нет



Цитата(dsergey @ 30.9.2004, 16:49)
Цитата
Не забывай про высоту символов


Все верно, имя окна "Global Mail" и мя искомого окна "Global Mail"
--------------------
И что бы там не происходило, не стоит воспринимать жизнь слишком всерьёз, всё равно нам из неё живыми не выбраться!!!
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 30.9.2004, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Вместо:
Код
function FindAWindow(Caption : string;
                                 ClassName : string) : THandle;
            var
              WindowInfo : TFindWindowStruct;

            begin
              with WindowInfo do begin
                Caption := Caption;
                ClassName := ClassName;

Напиши:
Код
            function FindAWindow(ACaption : string;
                                 AClassName : string) : THandle;
            var
              WindowInfo : TFindWindowStruct;

            begin
              with WindowInfo do begin
                Caption := ACaption;
                ClassName := AClassName;
PS: а чем тебя обычный FindWindow не устраивает ? Или там кроме "Global Mail" в заголовке еще что-то написано ?

Когда нашёл окно, надо получить его меню (GetMenu). Потом ищем в меню пункт "Файл", в подменю - "Импорт", и т.д. Дальше - комментарии в тексте:
Код
var
 menu : HMENU;
 TheWindowHandle, wnd2, wndBtn : HWND;
 nItem, nItemID : integer;
 mi : TMENUINFO;

 function FindMenuItem (m : HMENU; const Item : string) : integer;
 var
   i : integer;
   Buf : PChar;
 begin
   Result := -1;
   GetMem (Buf, 255);
   for i := 0 to GetMenuItemCount(m)-1 do
   begin
     GetMenuString (m, i, Buf, 255, MF_BYPOSITION);
     if Buf = Item then
     begin
       Result := i;
       Break;
     end;
   end;
   FreeMem (Buf);
 end;

begin
 TheWindowHandle := FindAWindow ('Global Mail', '');
 menu := GetMenu (TheWindowHandle);
 menu := MainMenu1.Handle;
 menu := GetSubMenu (menu, FindMenuItem (menu, 'Файл'));
 menu := GetSubMenu (menu, FindMenuItem (menu, 'Импорт'));
 nItem := FindMenuItem (menu, 'Выборочный импорт');
// нашли наш пункт меню, теперь надо активировать его
 nItemID := GetMenuItemID (menu, nItem);
 mi.cbSize := SizeOf(mi);
 GetMenuInfo (menu, mi);
 if (mi.dwStyle and MNS_NOTIFYBYPOS) = MNS_NOTIFYBYPOS then
   SendMessage (TheWindowHandle, WM_MENUCOMMAND, nItem, menu)
// Примечание в MSDN насчёт предпоследнего параметра:
// Windows 98/Me: The high word is the zero-based index of the item selected. The low word is the item ID.
// мне лень это учитывать, так что сделай сам...
 else
   SendMessage (TheWindowHandle, WM_COMMAND, nItemID, 0);
...
// to be continued...

Дальше ждём появления окна "Выборочный импорт" с помощью FindWindowEx и жмем кнопку:
Код
...
// ...продолжение
 repeat
   wnd2 := FindWindow (nil, 'Выборочный импорт');
   Sleep(0);
 until wnd2 <> 0;

 wndBtn := FindWindowEx (wnd2, 0, nil, 'Начать');

// имитируем клик мышкой
 SendMessage(wndBtn, WM_LBUTTONDOWN, 0, 0);
 SendMessage(wndBtn, WM_LBUTTONUP, 0, 0);
Вроде типа того должно быть...

Это сообщение отредактировал(а) p0s0l - 30.9.2004, 21:04


--------------------
С уважением, г-н Посол.
PM   Вверх
andrey_post
Дата 1.10.2004, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 23.12.2003
Где: Екатеринбург

Репутация: нет
Всего: нет



p0s0l спасибо огромное! Правда не работает нажатие на кнопку, прога че-то виснет sad.gif
--------------------
И что бы там не происходило, не стоит воспринимать жизнь слишком всерьёз, всё равно нам из неё живыми не выбраться!!!
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 1.10.2004, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



"Виснет" в цикле:
Цитата
repeat
    wnd2 := FindWindow (nil, 'Выборочный импорт');
    Sleep(0);
  until wnd2 <> 0;

Т.е. не может найти окно с этим заголовком. Если такого окна не появится, то цикл будет бесконечным...
Попробуй разобраться, почему не находит окно...


--------------------
С уважением, г-н Посол.
PM   Вверх
andrey_post
Дата 3.10.2004, 05:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 23.12.2003
Где: Екатеринбург

Репутация: нет
Всего: нет



хм, самое интересное что окно появляется... когда его зарываю программа сразу развисает... withstupid.gif
--------------------
И что бы там не происходило, не стоит воспринимать жизнь слишком всерьёз, всё равно нам из неё живыми не выбраться!!!
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 3.10.2004, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Тогда дело в чём-то другом... В отладчике пошагово прогони, и посмотри где виснет...



--------------------
С уважением, г-н Посол.
PM   Вверх
andrey_post
Дата 4.10.2004, 07:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 23.12.2003
Где: Екатеринбург

Репутация: нет
Всего: нет



Вот тут
Код

SendMessage(TheWindowHandle, WM_COMMAND, nItemID, 0);

окно делается активным и все стопорится. его закрываю и дальше по коду идет исполнение
--------------------
И что бы там не происходило, не стоит воспринимать жизнь слишком всерьёз, всё равно нам из неё живыми не выбраться!!!
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 4.10.2004, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Попробуй вместо SendMessage использовать PostMessage...
Отличие в том, что SendMessage ждёт, пока сообщение обработается, а PostMessage - нет...




--------------------
С уважением, г-н Посол.
PM   Вверх
andrey_post
Дата 4.10.2004, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 23.12.2003
Где: Екатеринбург

Репутация: нет
Всего: нет



Канает!!! УРАААААААААААААА!!!!!!!!
слушай, а как на окне сообщения надать кнопку.
вообщем после импорта появляется MessageBox в котором надо кнопку ОК нажать. она там одна
--------------------
И что бы там не происходило, не стоит воспринимать жизнь слишком всерьёз, всё равно нам из неё живыми не выбраться!!!
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 4.10.2004, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Ну уж ты совсем разленился smile.gif
Делается аналогично:
Код

repeat
   wnd2 := FindWindow (nil, <Имя окна, в котором кнопка ОК>);
   Sleep(0);
 until wnd2 <> 0;

 wndBtn := FindWindowEx (wnd2, 0, nil, 'OK');

// имитируем клик мышкой
 SendMessage(wndBtn, WM_LBUTTONDOWN, 0, 0);
 SendMessage(wndBtn, WM_LBUTTONUP, 0, 0);




--------------------
С уважением, г-н Посол.
PM   Вверх
andrey_post
Дата 5.10.2004, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 23.12.2003
Где: Екатеринбург

Репутация: нет
Всего: нет



Да не p0s0l не разлениелся. Окно с кнопкой ОК появляется от окна Global Mail и имеет такой-же заголовок.
Прога причем пытается найти кнопку ОК у родительского окна....
Ладно, поковыряюсь!!!
СПАСИБО ОГРОМНОЕ!!!! hehe.gif thumbs-up.gif
--------------------
И что бы там не происходило, не стоит воспринимать жизнь слишком всерьёз, всё равно нам из неё живыми не выбраться!!!
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.