Главная страница
    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.145 c
15-1185103037
oldman
2007-07-22 15:17
2007.08.19
Все были правы, от Инета никуда не деться...


4-1172960135
leonidus
2007-03-04 01:15
2007.08.19
Аналог GetAsyncKeyState для мыши


4-1172494487
Unknown user
2007-02-26 15:54
2007.08.19
Как БЫСТРО подсчитать кол-во файлов в заданном каталоге?


2-1185386389
Alexey_k
2007-07-25 21:59
2007.08.19
Сворачивание формы


2-1185039805
kernel
2007-07-21 21:43
2007.08.19
"Постоянный ShowWindow(HWND, SW_HIDE)"





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский