delphi最小化系统托盘

老杨_sz 2009-12-15 09:22:09
如下修改如下代码,在原有最小化系统托盘、点击左键打开的基础上,实在点击右键显示“显示”,“退出”菜单并实在窗口打开和关闭。每次关闭都要自动删除托盘图标。

代码如下:

unit Unit1;

interface

uses
Windows, Messages, SysUtils,Classes, Graphics, Controls, Forms, Dialogs,ShellAPI,
Menus;

const
WM_BARICON=WM_USER+200;
WM_TRAYNOTIFY=2000;

type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
procedure N2Click(Sender: TObject);
procedure wmTrayNotify(var Msg:TMessage);message WM_TRAYNOTIFY;
procedure N1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;
procedure WMBarIcon(var Message:TMessage);message WM_BARICON;
{ Private declarations }
public
{ Public declarations }

end;

var
Form1: TForm1;
Nid:TNotifyIconData;//定义ICON结构

implementation

{$R *.DFM}

procedure TForm1.WMSysCommand(var Message:TMessage);
var
lpData:PNotifyIconData;
begin
if Message.WParam = SC_ICON then
begin
//如果用户最小化窗口则将窗口隐藏并在任务栏上添加图标
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;
//SizeOf(PNotifyIconDataA);
lpData.Wnd := Form1.Handle;
lpData.hIcon := Form1.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
// lpData.uCallbackMessage := WM_TRAYNOTIFY;
lpData.uID :=0;
lpData.szTip := 'Samples';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_ADD,lpData);
dispose(lpData);
Form1.Visible := False;
end
else
begin
//如果是其它的SystemCommand消息则调用系统缺省处理函数处理之。
DefWindowProc(Form1.Handle,Message.Msg,Message.WParam,Message.LParam);
end;
end;

procedure TForm1.WMBarIcon(var Message:TMessage);
var
lpData:PNotifyIconData;
begin
if (Message.LParam = WM_LBUTTONDOWN) then
begin
//如果用户点击任务栏图标则将图标删除并回复窗口。
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
lpData.Wnd := Form1.Handle;
lpData.hIcon := Form1.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := 'Samples';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_DELETE,lpData);
dispose(lpData);
Form1.Visible := True;
end;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
Halt;
end;

procedure TForm1.wmTrayNotify(var Msg: TMessage);
var
p:TPoint;
begin
if(Msg.lparam=WM_LBUTTONDBLCLK) then
begin
ShowWindow(Application.Handle,SW_SHOW);
Application.Restore;
end else
if(Msg.LParam=WM_RButtonUp) then
begin
GetCursorPos(P);//获得鼠标坐标
PopupMenu1.Popup(P.X, P.Y);//在鼠标光标处显示弹出菜单
end;
end;//自己写的wmTrayNotify函数


procedure TForm1.N1Click(Sender: TObject);
begin

ShowWindow(Application.Handle,SW_SHOW);
Form1.Visible := True;
//Application.Restore;
Shell_NotifyIcon(NIM_DELETE,@Nid);
end;//弹出菜单中的 显示窗口 选项被选后的处理过程

procedure TForm1.FormCreate(Sender: TObject);
begin
Nid.cbSize:=sizeof(TNotifyIconData);
Nid.Wnd:=Handle;
Nid.uID:=1000;
Nid.uFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP;
//Nid.uCallbackMessage:=WM_TRAYNOTIFY;
Nid.uCallbackMessage:=WM_BARICON;
Nid.hIcon:=Application.Icon.Handle;
Nid.szTip:='我隐藏在系统托盘里了';
Shell_NotifyIcon(NIM_ADD,@Nid);
end;//这段代码是用来定制自己的ICON图标的,它将显示在托盘里

procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,@Nid);
end;//窗口销毁时不要忘记顺带处理掉那个小图标啊


end.

...全文
324 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongnanyanhai 2010-08-08
  • 打赏
  • 举报
回复
很多人回复直接找控件,但我想还是支持楼主,知其然者能,求知其所以然者智!
lyhoo163 2009-12-15
  • 打赏
  • 举报
回复
使用TrayIcon不是很好吗!
hjkto 2009-12-15
  • 打赏
  • 举报
回复
用TrayIcon
wintergoes 2009-12-15
  • 打赏
  • 举报
回复
直接用三方控件吧
犯不着在这上面浪费时间
可以用TrayIcon,单独的控件,安装方便
或者Raize系列里的控件
或者2007里有自带的
idecl 2009-12-15
  • 打赏
  • 举报
回复
直接下个现成的控件好了

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧