Delphi实现系统托盘管理
Delphiadmin 发布于:2017-11-17 17:21:46
阅读:loading
几乎所有的CS端程序都有在系统托盘显示图标的功能,如:最小化显示托盘,右键进行对软件的其他*作等,我们使用Delphi写的一些“渣渣”程序经常使用且能最小化至系统托盘当然是最好的了,在综合了好多资料后,实现了本例,才有了本文。本例实现的功能点主要有:
(1)打开窗口软件时使其在系统托盘显示图标;
(2)点击软件最小化按钮,将其隐藏;
(3)右键系统托盘软件可显示相关菜单按钮,点击不同菜单的功能实现;
unit NotifyTray;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls , TLHelp32, Menus , ShellApi , StrUtils;
type
TForm1 = class(TForm)
Label1: TLabel;
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure HideForm(Sender: TObject);
private
{ Private declarations }
procedure WMSysCommand(var message: TMessage); message WM_SYSCOMMAND;
public
{ Public declarations }
procedure WndProc(var msg:TMessage);override;
end;
var
Form1: TForm1;
nd0,nd1 : NotifyIconData;
WM_TRAYNOTIFY: Cardinal;
hs: array[0..1] of LongWord;
IconFlag : Integer;
dt:String;
const
TrayMsgStr = 'TrayNotifyIconMsg';
implementation
{$R *.dfm}
procedure TForm1.WMSysCommand(var message: TMessage);
begin
if Message.WParam = SC_CLOSE then
begin
Application.Terminate;
end
else if Message.WParam = SC_MINIMIZE then
begin
Form1.Visible := false;
end
else
begin
//如果是其它行为则调用系统自带的实现
DefWindowProc(Form1.Handle , Message.msg , Message.WParam , Message.LParam);
end;
end;
procedure TForm1.WndProc(var msg:Tmessage);
var
pt:TPoint;
begin
with msg do
begin
if msg = WM_TRAYNOTIFY then
begin
case lParam of
WM_LBUTTONDOWN:
begin
hs[1] := LoadIcon(hInstance , 'Icon1');
nd1.cbSize := 88;
nd1.Wnd := Handle;
nd1.uId := 1;
nd1.szTip := '提示信息';
nd1.uFlags := NIF_MESSAGE OR NIF_ICON OR NIF_TIP;
nd1.uCallbackMessage := WM_TRAYNOTIFY;
nd1.hIcon := hs[1];
Shell_notifyIcon(NIM_MODIFY , @nd1);
IconFlag := 1;
Form1.Show;
end;
WM_LBUTTONDBLCLK:
begin
Self.Visible := true;
end;
WM_RBUTTONDOWN:
begin
SetForegroundWindow(Handle);
GetCursorPos(pt);
PopupMenu1.popup(pt.x , pt.y);
end;
end;
end
end;
inherited;
end;
procedure TForm1.N1Click(Sender: TObject);
begin
Form1.Visible := true;
end;
procedure TForm1.N2Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm1.HideForm(Sender: TObject);
begin
showmessage('hideform');
Form1.Visible := false;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
WM_TRAYNOTIFY := RegisterWindowMessage(TrayMsgStr);
hs[0] := LoadIcon(hInstance , 'MainIcon');
nd0.cbSize := 88;
nd0.Wnd := Handle;
nd0.szTip := '提示信息';
nd0.uID := 0;
nd0.uFlags := NIF_MESSAGE OR NIF_ICON OR NIF_TIP;
nd0.uCallbackMessage := WM_TRAYNOTIFY;
nd0.hIcon := hs[0];
Shell_notifyicon(NIM_ADD , @nd0);
IconFlag := 0;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if (IconFlag = 0) then
Shell_NotifyIcon(NIM_DELETE , @nd0)
else
Shell_NotifyIcon(NIM_DELETE , @nd1);
end;
end.
点赞