Это статья для тех, кто хотел добавить свои пункты в системное меню, но не знал, как сделать это. Здесь мы добавляем свои пункты меню в системное меню приложения, а также обработчик событий для новых пунктов меню. Нет никаких стандартных средств Delphi для добавления пунктов в системное меню. Нам нужно создать ловушку сообщения WM_SYSCOMMAND и значение WPARAM сообщения, чтобы определить какой пункт меню выбран. В общем, все, что нужно сделать заключается в следующем:
- Создать новую форму Delphi.
- Переопределить событие OnMessage, назначив новую процедуру для обработки события OnMessage.
- Определить константы, которые будут использоваться, как идентификатор для пунктов меню.
- В событии 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.
Вот и все! Это очень просто!
|