Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2007.08.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
2-1182812377
Сергей Макс.
2007-06-26 02:59
2007.08.19
SetFileSecurity


15-1184567041
boriskb
2007-07-16 10:24
2007.08.19
Кто-нибудь из молодых себя узнаёт?


2-1184810860
dimaL
2007-07-19 06:07
2007.08.19
FireBird и компоненты вкладки Interbase


15-1185103037
oldman
2007-07-22 15:17
2007.08.19
Все были правы, от Инета никуда не деться...


1-1180541090
DevilDevil
2007-05-30 20:04
2007.08.19
ShowModal и MessageBox