| 
| 
 | Вопрос # 4 187/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Моя проблема состоит втом что я хочу нажать програмно на пункт меню в чужом приложении, например WindowsMediaPlayer, понимаю что нужно работать либо через SendMessage, либо через переменную типа HMENU, значение которой равно menu:=GetMenu(HWND), но я не знаю как действовать дальше в первом и во втором случае т.к. в этом плане неопытен. Порылся в книге Microsoft Windows API, но нужной апишки так и не подискал.
 Также понимаю что можно вычислить координаты расположения пунктов меню и затем програмно кликнуть мышью, но мне этот вариант не нравится.
 Приложение:Переключить в обычный режим unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type  TForm1 = class(TForm)    Button1: TButton;    procedure Button1Click(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1;  Window:HWND; implementation {$R *.dfm} Procedure FindPlayer()BeginWindow:=FindWindow(nil,'WindowsMediaPlayer');End; procedure TForm1.Button1Click(Sender: TObject);varMenu:HMENU;beginFindPlayer();If window<>0 then Begin   Menu:=GetMenu(Window);  End;end; end. 
|  |   Вопрос задал: SOA (статус: Посетитель)Вопрос отправлен: 19 мая 2010, 21:10
 Состояние вопроса: открыт, ответов: 0.
 |  
 Мини-форум вопросаВсего сообщений: 11; последнее сообщение — 14 июля 2010, 15:16; участников в обсуждении: 3. 
|   | Amidamaru (статус: 4-ый класс), 19 мая 2010, 22:52 [#1]:ну.. наверное нужно начать с GetMenuItemCount; перебором через GetMenuString найти нужный пункт;
 получить GetMenuItemID (и проверить не равно ли оно -1, на всякий случай);
 а потом...
 
 SendMessage(Window,WM_COMMAND,MakeWParam(MenuItemID,0),0); |  
|   | SOA (статус: Посетитель), 20 мая 2010, 07:59 [#2]:Спасибо попробую. |  
|   | SOA (статус: Посетитель), 20 мая 2010, 13:30 [#3]:В моем случае GetMenuItemCount показывает -1, всвязи с чем далее изучать меню не получается, по видимому функция GetMenu выдает почемуто идентификатор меню моего окна, а не того что мне надо. Пытаюсь реализовать через функцию GetMenuBarInfo, уже и типы объявил,
 только компилятор выдает ошибку несоответствия типов(Types of actual and formal var must be identical) в строчке
 GetMenuBarInfo(Window,OBJID_SYSMENU,0,@Menu);, не понимаю в чем дело =(
 
 ----------------------------------------------------------
 unit Unit1;
 
 interface
 
 uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Grids, ValEdit;
 
 type
 TForm1 = class(TForm)
 Button1: TButton;
 Label1: TLabel;
 procedure Button1Click(Sender: TObject);
 private
 { Private declarations }
 public
 { Public declarations }
 end;
 
 var
 Form1: TForm1;
 Window:HWND;
 FindMenuID: UINT;//Идентификатор искомого пункта меню
 
 implementation
 
 {$R *.dfm}
 
 Procedure FindPlayer();
 Begin
 Window:=FindWindow(nil,'WindowsMediaPlayer');
 End;
 
 procedure TForm1.Button1Click(Sender: TObject);
 type RECT=TRECT;
 
 type MENUBARINFO = record
 cbsize: DWORD;
 RcBar: RECT;
 hMenu: HMENU;
 hWndMenu: HWND;
 fbarFocused: BOOL;
 fFocused: BOOL;
 END;
 
 var
 Menu:MENUBARINFO;
 //Menu:HMENU;
 NUMBER:integer;//Количество пунктов меню
 MenuItmID: array[1..500] of UINT;
 MenuName:String;
 begin
 FindPlayer();
 If window<>0 then
 Begin
 ShowMessage('Нашли');
 GetMenuBarInfo(Window,OBJID_SYSMENU,0,@Menu);
 //Menu:=GetMenu(Window);
 NUMBER:=GetMenuItemCount(Menu.hMenu);//Определяем количество пунктов меню
 Label1.Caption:=IntToStr(NUMBER);
 {
 if NUMBER<>-1 then
 While NUMBER<>-1 do//Определяем идентификаторы меню
 Begin
 MenuItmID[NUMBER]:=GetMenuItemID(Menu,NUMBER);
 NUMBER:=NUMBER-1;
 End;
 NUMBER:=100;
 
 While NUMBER<>-1 do
 Begin
 GetMenuString(Menu,MenuItmID[NUMBER],@MenuName,255,MF_BYCOMMAND);
 If MenuName='Tools' then
 Begin
 FindMenuID:=MenuItmID[NUMBER];//Нашли искомый пункт меню
 Break;
 End;
 NUMBER:=NUMBER-1;
 End;
 SendMessage(Window,WM_COMMAND,MakeWParam(FindMenuID,0),0);
 ShowMessage('Готово');}
 End;
 end;
 
 end.
 |  
|   | Amidamaru (статус: 4-ый класс), 20 мая 2010, 18:27 [#4]:Может потому что тип MENUBARINFO уже существует? и называется например TMENUBARINFO |  
|   | SOA (статус: Посетитель), 20 мая 2010, 19:45 [#5]:Да действительно тип TMENUBARINFO существует, но как оказлось, дело не только в этом, нужно было вместо GetMenuBarInfo(Window,OBJID_SYSMENU,0,@Menu); написать
 GetMenuBarInfo(Window,OBJID_MENU,0,Menu);, тоесть не использовать указателя, но какбы ни было, функция
 GetMenuItemCount(Menu.hMenu) стабильно выдает -1, даже после приравнивания хэндлов окон структуры menu и window
 Menu.hwndMenu:=Window;
 |  
|   | Amidamaru (статус: 4-ый класс), 20 мая 2010, 21:39 [#6]:Тогда даже не знаю, что предложить... Посмотри что возвращает GetLastError.
 Попробуй ещё функцию IsMenu, может там вообще не менюшный хендл.
 |  
|   | SOA (статус: Посетитель), 21 мая 2010, 09:14 [#7]:Да функция IsMenu выдает что это не меню =( похоже решение вопроса зашло в тупик.
 |  
|   | Тарасов Андрей (статус: Посетитель), 11 июля 2010, 12:36 [#8]:RTFM GetMenuBarInfo 
 1: Menu.cbSize := SizeOf(TMenuBarInfo);
 2: GetMenuBarInfo(Window,OBJID_MENU,0,Menu);
 
 
 SizeOf(TMenuBarInfo); в дельфе возвращает 29, а в С++ 32!!!!!
 руками указал 32 - функция заработала, а так она у тебя просто не работает. К тому же ты не проверяешь выполнение, делай так(проще будет):
 
 if GetMenuBarInfo(Window,OBJID_MENU,0,Menu) then.....
 |  
|   | SOA (статус: Посетитель), 13 июля 2010, 17:59 [#9]:To Тарасов Андрей: попробуй с браузером Opera функцию IsMenu, она тебе выдаст что там меню НЕТ. И в этом была вся проблема, потому что нельзя получить хэндл того чего нет.
 
   |  
|   | Тарасов Андрей (статус: Посетитель), 14 июля 2010, 07:31 [#10]:ну в опере в частности меню самодельное, а не системное и к тому-же вынесено в отдельное окно. 
 а зачем это вам понадобилось в опере нажимать меню? вирус пишете?
 |  
|   | SOA (статус: Посетитель), 14 июля 2010, 15:16 [#11]:Не вирус но принципы те же(настройками манипулировать хочу). А весь интерфейс в Opera как я понимаю организован также как и в Fire Fox на основе java script и xml, вот только мануалов по написанию плагинов к Opera я к сожалению не нашел, в отличии от FF. На официальной странице Opera в разделе development написано по содержанию примерно следующее
 Все организовано также как и в Fire fox.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |