Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];

Вниз

MainMenu1 нажатие кнопки в меню   Найти похожие ветки 

 
buben ©   (2007-03-03 14:29) [0]

Как нажать, нужную мне кнопку, в меню MainMenu1, чужого приложения?

Пример чужого приложения:
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus;

type
 TForm1 = class(TForm)
   MainMenu1: TMainMenu;
   N1: TMenuItem;
   N111: TMenuItem;
   N222: TMenuItem;
   N333: TMenuItem;
   procedure N111Click(Sender: TObject);
   procedure N222Click(Sender: TObject);
   procedure N333Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.N111Click(Sender: TObject);
begin
showmessage("1");
end;

procedure TForm1.N222Click(Sender: TObject);
begin
showmessage("2");
end;

procedure TForm1.N333Click(Sender: TObject);
begin
showmessage("3");
end;

end.


Нужно нажать на N222 компонента MainMenu1


 
Лёля   (2007-03-03 15:42) [1]

Привет!
Вот кусочек учебно-тренировочного кода, без проверок:

type
 TfrmGetMenuTest = class(TForm)
   btnGetMenu: TButton;
   TreeView1: TTreeView;
   rgWin: TRadioGroup;
   CheckBox1: TCheckBox;
   Memo1: TMemo;
   edtWinClass: TEdit;
   Label1: TLabel;
   procedure btnGetMenuClick(Sender: TObject);
   procedure TreeView1Click(Sender: TObject);
 private
   function GetAppWin: HWND;
   procedure FillChildren(ParentNode: TTreeNode; Menu: hMenu);
 end;

var
 frmGetMenuTest: TfrmGetMenuTest;

implementation

{$R *.dfm}

//получаем меню выбранного окна
procedure TfrmGetMenuTest.btnGetMenuClick(Sender: TObject);
var
 Win: HWND;
 hMnu: HMenu;
begin
 Win := GetAppWin;
 if Win = 0 then
   Exit;
 hMnu := GetMenu(Win);
 TreeView1.Items.BeginUpdate;
 try
   TreeView1.Items.Clear;
   FillChildren(nil, hMnu);
 finally
   TreeView1.Items.EndUpdate;
 end;
end;

//строим дерево меню
procedure TfrmGetMenuTest.FillChildren(ParentNode: TTreeNode; Menu: hMenu);
var
 i, MenuItemCount: Integer;
 NewNode: TTreeNode;
 ItemID: Cardinal;
 ItemSubMenu: HMenu;
 ItemString1: array[0..127] of char;
begin
 MenuItemCount := GetMenuItemCount(Menu);
 for i := 0 to MenuItemCount - 1 do
 begin
   ItemID := GetMenuItemID(Menu, i);
   ItemSubMenu := GetSubMenu(Menu, i);
   GetMenuString(Menu, i, ItemString1, SizeOf(ItemString1), MF_BYPOSITION);  

   NewNode := TreeView1.Items.AddChild(ParentNode, Format("ItemID = %d, «%s» = %d ", [{IntToHex(}ItemID {, 0)}, ItemString1, ItemSubMenu]));
   NewNode.Data := Pointer(ItemID);
   if ItemSubMenu <> 0 then
     FillChildren(NewNode, ItemSubMenu)
 end;
end;

//возвращает хэндл окна (по идее, содержащего меню)
function TfrmGetMenuTest.GetAppWin: HWND;
var
 s: string;
begin
 case rgWin.ItemIndex of
   0: s := "MSPaintApp";
   1: s := "TTOTAL_CMD";
   2: s := "Notepad";
   3: s := edtWinClass.Text;
 end;
 Result := FindWindow(PChar(s), nil);
 if Result = 0 then
   MessageBox(Handle, "БУ!", "", MB_OK or MB_ICONERROR);
end;

//посылаем команду меню
procedure TfrmGetMenuTest.TreeView1Click(Sender: TObject);
begin
 if (TreeView1.SelectionCount <> 0) and (CheckBox1.Checked) then
   SendMessage(GetAppWin, WM_COMMAND, Integer(TreeView1.Selected.Data), 0)
end;


Удачи!


 
buben ©   (2007-03-03 18:25) [2]

Лёля, прив, спасиб.
так открывается в своем SendMessage(handle,WM_Command,3,0);

вопрос все еще открыт. Думаю, что это не реально сделать SendMessage(handle,  так как хэндэл, назначается случайным оброзом, при каждом открытии меню он разный.


 
Leonid Troyanovsky ©   (2007-03-03 20:07) [3]


> buben ©   (03.03.07 18:25) [2]

> SendMessage(handle,  так как хэндэл, назначается случайным
> оброзом, при каждом открытии меню он разный.

Это сообщение отсылается окну, чье меню.

См. также
http://groups.google.com/group/fido7.ru.delphi/msg/925bebee0309bec9

--
Regards, LVT.


 
buben ©   (2007-03-03 21:45) [4]

Leonid Troyanovsky, дай я тебе расцелую)))


 
Leonid Troyanovsky ©   (2007-03-03 21:55) [5]


> buben ©   (03.03.07 21:45) [4]

> Leonid Troyanovsky, дай я тебе расцелую)))

Вообще-то, я лесбиян.

--
Regards, LVT.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.048 c
3-1178274065
Sapos
2007-05-04 14:21
2007.08.19
Добавление записей.


2-1185480232
copron
2007-07-27 00:03
2007.08.19
messagebox


15-1184667005
pavel_guzhanov
2007-07-17 14:10
2007.08.19
Умер Михаил Кононов


15-1184855110
Kerk
2007-07-19 18:25
2007.08.19
Google-калькулятор теперь на русском


1-1181322952
dRake
2007-06-08 21:15
2007.08.19
Средство для сбора дебаг-инфы после падения программы (+)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский