Я хочу свести приложение Delphi к панели задач вместо панели задач.
Необходимые шаги кажутся следующими:
- Создайте значок, который затем должен отображаться в панели задач.
- When the user clicks the [-] to minimize the application, do the following:
- Hide the form.
- Добавьте значок (шаг №1) на панель задач.
- Скрыть / удалить запись о приложении на панели задач.
- When the user double-clicks the application's icon in the systray, do the following:
- Show the form.
- Снова отмените сворачивание приложения и выведите его на передний план.
- Если «WindowState» имеет значение «WS_Minimized», установите значение «WS_Normal».
- Скрыть / удалить значок приложения на панели задач.
- When the user terminates the application, do the following:
- Hide/delete the application's icon in the systray.
Вот и все. Правильно?
Как это реализовать в Delphi?
Я нашел следующий код, но не знаю, почему он работает. Это не соответствует моим шагам, описанным выше ...
unit uMinimizeToTray;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ShellApi;
const WM_NOTIFYICON = WM_USER+333;
type
TMinimizeToTray = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure CMClickIcon(var msg: TMessage); message WM_NOTIFYICON;
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
MinimizeToTray: TMinimizeToTray;
implementation
{$R *.dfm}
procedure TMinimizeToTray.CMClickIcon(var msg: TMessage);
begin
if msg.lparam = WM_LBUTTONDBLCLK then Show;
end;
procedure TMinimizeToTray.FormCreate(Sender: TObject);
VAR tnid: TNotifyIconData;
HMainIcon: HICON;
begin
HMainIcon := LoadIcon(MainInstance, 'MAINICON');
Shell_NotifyIcon(NIM_DELETE, @tnid);
tnid.cbSize := sizeof(TNotifyIconData);
tnid.Wnd := handle;
tnid.uID := 123;
tnid.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
tnid.uCallbackMessage := WM_NOTIFYICON;
tnid.hIcon := HMainIcon;
tnid.szTip := 'Tooltip';
Shell_NotifyIcon(NIM_ADD, @tnid);
end;
procedure TMinimizeToTray.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caNone;
Hide;
end;
end.