Внешний вид сайта:

Создание своих пунктов в системном меню

Это статья для тех, кто хотел добавить свои пункты в системное меню, но не знал, как сделать это. Здесь мы добавляем свои пункты меню в системное меню приложения, а также обработчик событий для новых пунктов меню. Нет никаких стандартных средств Delphi для добавления пунктов в системное меню.

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

  1. Создать новую форму Delphi.
  2. Переопределить событие OnMessage, назначив новую процедуру для обработки события OnMessage.
  3. Определить константы, которые будут использоваться, как идентификатор для пунктов меню.
  4. В событии OnCreate формы создать пункты меню при помощи функции API AppendMenu.

Вот пример использования:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure WinMsgHandler(
          var Msg : TMsg; var Handled : Boolean);
  end;

var
  Form1: TForm1;
const 
  MyItem1 = 100; { Иденнификатор пункта меню 1. Любое значение WORD}
  MyItem2 = 101; { Идентификатор пункта меню 2 }
  MyItem3 = 102; { Идентификатор пункта меню 3 }

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, MyItem1, 'Пункт моего меню № 1');

  AppendMenu(GetSystemMenu(Self.Handle, False),
             MF_BYPOSITION, MyItem2, 'Пункт моего меню № 2');

  AppendMenu(GetSystemMenu(Self.Handle, False),
             MF_BYPOSITION, MyItem3, 'Выход из программы');

end;

procedure TForm1.WinMsgHandler(var Msg : TMsg;
                          var Handled : Boolean);
begin
 { Если системное сообщение...}
  if Msg.Message=WM_SYSCOMMAND then
     { Поместим обработчик сюда.
      ShowMessage для демонстрации }
   Case Msg.wParam of
    MyItem1: ShowMessage('Нажали меню 1');
    MyItem2: ShowMessage('Нажали меню 2');
    MyItem3: Close; { А здесь выходим из приложения }
   end;
end;
end.

Вот и все! Это очень просто!

Комментарии

Нет комментариев. Ваш будет первым!