Delphi7如何实现QQ托盘闪动消息提示?
我已经实现闪动的效果,但是闪动时在图标上点击没有效果,源码如下,请大师帮忙解答?unitUnit1;//..........................private...
我已经实现闪动的效果,但是闪动时在图标上点击没有效果,源码如下,请大师帮忙解答?
unit Unit1;
//..........................
private
MyTrayIcon:TNotifyIcondata;
procedure WMMyTrayIconCallback(var Msg:TMessage);message WM_MYTRAYICONCALLBACK;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMMyTrayIconCallback(var Msg: TMessage);
var
cursorpos:Tpoint;
begin
////////////////////////////////////////////////////////////////////////////////
// 在这里处理用户点击托盘图标事件,可以根据WM_MOUSEMOVE消息的不同情况产生不同的
// 回应,例如区别对待单击和双击等等
////////////////////////////////////////////////////////////////////////////////
case Msg.LParam of
WM_LBUTTONDOWN: //左键按下显示弹出菜单
begin
getcursorpos(cursorpos);
SetForegroundWindow(handle);
Application.ProcessMessages;
PostMessage(Application.MainForm.Handle, WM_NULL, 0, 0);
end;
WM_LBUTTONDBLCLK: //左键双击(显示程序窗体的同时,删除托盘图标)
begin
Visible:=not Visible;
Application.ShowMainForm:=Visible;
SetForegroundWindow(Application.handle);
Shell_NotifyIcon(NIM_DELETE,@MyTrayIcon); //删除托盘图标
end;
WM_RBUTTONDOWN: //右键按下显示弹出菜单
begin
getcursorpos(cursorpos);
SetForegroundWindow(handle);
Application.ProcessMessages;
PopupMenu1.Popup(cursorpos.X,cursorpos.y);
PostMessage(Application.MainForm.Handle, WM_NULL, 0, 0);
end;
end;
end;
procedure TForm1.OpenClick(Sender: TObject);
begin
Application.ShowMainForm:=Visible;
self.Show;
SetForegroundWindow(Application.handle);
Shell_NotifyIcon(NIM_DELETE,@MyTrayIcon); //删除托盘图标
end;
procedure TForm1.CloseClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if MessageBox(Handle,'是否最小化到托盘?','提示',MB_YesNo)=mrYes then
begin
CanClose := false;
self.Hide;
MyTrayIcon.cbSize := SizeOf(TNotifyIconData); //TrayIconData变量的字节数
MyTrayIcon.Wnd := Handle; //主窗口句柄
MyTrayIcon.uID := 1; //内部标识,可设为任意数
MyTrayIcon.uFlags := NIF_ICON OR NIF_TIP OR NIF_MESSAGE; //要加入的图标句柄,可任意指定,此处为在Tform中Icon属性中指定的图标
MyTrayIcon.uCallbackMessage := WM_MYTRAYICONCALLBACK; //回调函数
MyTrayIcon.hIcon := Icon.Handle;
MyTrayIcon.szTip := '便利店服务器'; // 图标的提示信息
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); //将程序的窗口样式设为TOOL窗口,可避免在任务条上出现
Shell_NotifyIcon(NIM_ADD,@MyTrayIcon); //向托盘中添加图标
end
else
begin
canclose := false;
Exit;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,@MyTrayIcon); //删除托盘图标
end; 展开
unit Unit1;
//..........................
private
MyTrayIcon:TNotifyIcondata;
procedure WMMyTrayIconCallback(var Msg:TMessage);message WM_MYTRAYICONCALLBACK;
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.WMMyTrayIconCallback(var Msg: TMessage);
var
cursorpos:Tpoint;
begin
////////////////////////////////////////////////////////////////////////////////
// 在这里处理用户点击托盘图标事件,可以根据WM_MOUSEMOVE消息的不同情况产生不同的
// 回应,例如区别对待单击和双击等等
////////////////////////////////////////////////////////////////////////////////
case Msg.LParam of
WM_LBUTTONDOWN: //左键按下显示弹出菜单
begin
getcursorpos(cursorpos);
SetForegroundWindow(handle);
Application.ProcessMessages;
PostMessage(Application.MainForm.Handle, WM_NULL, 0, 0);
end;
WM_LBUTTONDBLCLK: //左键双击(显示程序窗体的同时,删除托盘图标)
begin
Visible:=not Visible;
Application.ShowMainForm:=Visible;
SetForegroundWindow(Application.handle);
Shell_NotifyIcon(NIM_DELETE,@MyTrayIcon); //删除托盘图标
end;
WM_RBUTTONDOWN: //右键按下显示弹出菜单
begin
getcursorpos(cursorpos);
SetForegroundWindow(handle);
Application.ProcessMessages;
PopupMenu1.Popup(cursorpos.X,cursorpos.y);
PostMessage(Application.MainForm.Handle, WM_NULL, 0, 0);
end;
end;
end;
procedure TForm1.OpenClick(Sender: TObject);
begin
Application.ShowMainForm:=Visible;
self.Show;
SetForegroundWindow(Application.handle);
Shell_NotifyIcon(NIM_DELETE,@MyTrayIcon); //删除托盘图标
end;
procedure TForm1.CloseClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if MessageBox(Handle,'是否最小化到托盘?','提示',MB_YesNo)=mrYes then
begin
CanClose := false;
self.Hide;
MyTrayIcon.cbSize := SizeOf(TNotifyIconData); //TrayIconData变量的字节数
MyTrayIcon.Wnd := Handle; //主窗口句柄
MyTrayIcon.uID := 1; //内部标识,可设为任意数
MyTrayIcon.uFlags := NIF_ICON OR NIF_TIP OR NIF_MESSAGE; //要加入的图标句柄,可任意指定,此处为在Tform中Icon属性中指定的图标
MyTrayIcon.uCallbackMessage := WM_MYTRAYICONCALLBACK; //回调函数
MyTrayIcon.hIcon := Icon.Handle;
MyTrayIcon.szTip := '便利店服务器'; // 图标的提示信息
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); //将程序的窗口样式设为TOOL窗口,可避免在任务条上出现
Shell_NotifyIcon(NIM_ADD,@MyTrayIcon); //向托盘中添加图标
end
else
begin
canclose := false;
Exit;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,@MyTrayIcon); //删除托盘图标
end; 展开
3个回答
展开全部
何必这么累
找个托盘控件就可以实现
例如 TrayIcon
TrayIcon.Icons 对应一个 TImageList 来回切换就可以实现动画效果
CoolTrayIcon我用得最多,实现动画更简单点
找个托盘控件就可以实现
例如 TrayIcon
TrayIcon.Icons 对应一个 TImageList 来回切换就可以实现动画效果
CoolTrayIcon我用得最多,实现动画更简单点
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的闪动应该是循环在 Modify你的图标,再循环里面加上Application.ProcessMessages;
追问
在循环里面加上Application.ProcessMessages后,双击左键和单击右键都行,但是单击右键“打开”可以,“退出”程序不行,何解,求大师支招!!!
追答
首先你要先退出你的循环,再执行别的.
你的循环应该是在主线程执行的
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询