Как добавить свое меню в другое приложение
В основном Вы должны сделать это:
Создать новую форму, отменить событие OnMessage, назначив новую процедуру обработки события OnMessage. Создайте константу, которая будет использоваться как порядковый идентификатор для Вашего пункта меню.
В FormCreate сделайте Ваше меню вызовом Windows API AppendMenu. Вот код, который показывает, как сделать это:
uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, Menus; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { ... } public { Это объявление имеет тип TMessageEvent, который является указателем на процедуру которая получает два переменных параметра типа TMsg и Boolean, соответственно } procedure WinMsgHandler(var Msg : TMsg; var Handled : Boolean); end; var Form1: TForm1; const MyItem = 100; // Идентификатор меню. Это может быть любое значение WORD implementation {$R *.DFM} procedure TForm1.FormCreate(Sender: TObject); begin { Сначала сообщим приложению, что его обработчик события отличается от заданного по умолчанию } Application.OnMessage := WinMsgHandler; { Добавим разделитель } AppendMenu(GetSystemMenu(Self.Handle, False), MF_SEPARATOR, 0, ''); { Добавьте Ваше меню. Так как Item ID высок, использование константы MF_BYPOSITION разместит его в конец системного меню } AppendMenu(GetSystemMenu(Self.Handle, False), MF_BYPOSITION, MyItem, 'My Men&u Choice'); end; procedure TForm1.WinMsgHandler(var Msg: TMsg; var Handled: Boolean); begin { Если сообщение - системное... } if Msg.Message = WM_SYSCOMMAND then if Msg.wParam = MyItem then { Помещаем здесь код обработки. Здесь выбрано ShowMessage для демонстрации } ShowMessage('Вы щелкнули мое меню!!!'); end; end.
Как Вы, наверное, уже знаете, команда AppendMenu может использоваться также со свернутыми приложениями.
Например, если Вы сворачиваете форму, значок представляет приложение, а не Вашу форму. Поэтому, чтобы сделать системное меню с Вашим пунктом меню видимым в свернутой форме, нужно использовать Application.Handle
вместо Self.Handle
, чтобы иметь дело с системным меню приложения.
Комментарии