Карта сайтаСсылкиКонтакты

Как добавить свое меню в другое приложение

PDF Печать
Статьи

Нет никакого способа добавить пункт меню стандартным вызовом Delphi. Вы должны заманить в ловушку сообщение Windows WM_SYSCOMMAND окна и проверить элемент сообщения wParam, чтобы определить, что Ваш пункт меню был выбран. В основном Вы должны сделать это:

Создать новую форму, отменить событие 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, чтобы иметь дело с системным меню приложения.


 

Добавить комментарий


Защитный код
Обновить