delphi托盘图标鼠标进入离开事件

qq_33802316 2017-02-23 04:33:21
最近要做一个连天系统,程序最小化到托盘区时,如果有新消息到来的时候,鼠标移动上去需要弹出消息框,移开就隐藏,类似qq的那种。图标通过以下方式添加:
var lpData:PNotifyIconData;
lpData.uCallbackMessage := MY_MESSAGE;
Shell_NotifyIcon(NIM_ADD,lpData);
但是没法捕捉到鼠标移动到图标上以及离开事件,请问怎么才能实现这个目的呢
...全文
674 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_33802316 2017-02-27
  • 打赏
  • 举报
回复
引用 5 楼 santiaodahan 的回复:
如果是QQ那种样式的,不需要这么麻烦,直接给lpData赋值就可以:lpData.szTip:='第一行'+#13#10+'第二行'; 托盘区不支持鼠标进入、离开、悬停消息,可以支持鼠标移动消息。
这样是可以。但是我想做一个类似于qq的那种如果有消息到来小图标闪烁鼠标移上去就可以弹出一个消息预览框的那种。 现在鼠标移上去弹出一个框没问题了,在鼠标移开1秒后自动隐藏弹出框这个我想通过timer实现,但是无法启动timer,不知道什么原因
santiaodahan 2017-02-27
  • 打赏
  • 举报
回复
解决就好。我取了定时器那部分代码,响应WM_MOUSEMOVE试了一下,定时器正常触发。
qq_33802316 2017-02-27
  • 打赏
  • 举报
回复
多谢楼上的各位提供的思路和建议,找到问题的原因了,是自绘窗体的某个过程阻碍了timer的运行,另外也想到了一些解决办法,在此结贴
qq_33802316 2017-02-27
  • 打赏
  • 举报
回复
引用 11 楼 tiankun66 的回复:
你能用CTRL+D把 代码对齐后再和我们讨论下么。。。

习惯了

下面是定时器

大肚肥肥 2017-02-27
  • 打赏
  • 举报
回复
你能用CTRL+D把 代码对齐后再和我们讨论下么。。。
qq_33802316 2017-02-27
  • 打赏
  • 举报
回复
引用 9 楼 santiaodahan 的回复:
[quote=引用 8 楼 qq_33802316 的回复:]
[quote=引用 7 楼 santiaodahan 的回复:]
[quote=引用 6 楼 qq_33802316 的回复:]
[quote=引用 5 楼 santiaodahan 的回复:]
如果是QQ那种样式的,不需要这么麻烦,直接给lpData赋值就可以:lpData.szTip:='第一行'+#13#10+'第二行';
托盘区不支持鼠标进入、离开、悬停消息,可以支持鼠标移动消息。
这样是可以。但是我想做一个类似于qq的那种如果有消息到来小图标闪烁鼠标移上去就可以弹出一个消息预览框的那种。
现在鼠标移上去弹出一个框没问题了,在鼠标移开1秒后自动隐藏弹出框这个我想通过timer实现,但是无法启动timer,不知道什么原因[/quote]
动态改变szTip值也可以显示你的预览消息。闪烁的小图标是通过动态显示多个托盘图标实现的:Shell_NotifyIcon(NIM_MODIFY, lpData); 为什么无法启动timer,进入托盘区就打开计时器有何不可。[/quote]我也是想这样做,但是这个timer不晓得怎么回事就是没法启动,当执行showwindow(handle,sw_hide)后他就执行,恢复界面后又不执行了[/quote]
单步调试或贴代码。[/quote]

引用 9 楼 santiaodahan 的回复:
[quote=引用 8 楼 qq_33802316 的回复:]
[quote=引用 7 楼 santiaodahan 的回复:]
[quote=引用 6 楼 qq_33802316 的回复:]
[quote=引用 5 楼 santiaodahan 的回复:]
如果是QQ那种样式的,不需要这么麻烦,直接给lpData赋值就可以:lpData.szTip:='第一行'+#13#10+'第二行';
托盘区不支持鼠标进入、离开、悬停消息,可以支持鼠标移动消息。
这样是可以。但是我想做一个类似于qq的那种如果有消息到来小图标闪烁鼠标移上去就可以弹出一个消息预览框的那种。
现在鼠标移上去弹出一个框没问题了,在鼠标移开1秒后自动隐藏弹出框这个我想通过timer实现,但是无法启动timer,不知道什么原因[/quote]
动态改变szTip值也可以显示你的预览消息。闪烁的小图标是通过动态显示多个托盘图标实现的:Shell_NotifyIcon(NIM_MODIFY, lpData); 为什么无法启动timer,进入托盘区就打开计时器有何不可。[/quote]我也是想这样做,但是这个timer不晓得怎么回事就是没法启动,当执行showwindow(handle,sw_hide)后他就执行,恢复界面后又不执行了[/quote]
单步调试或贴代码。[/quote]
这是截取消息的代码
下面是定时器的代码

但是这个timer并没有执行,反而只是在我进行showwindo(handle,sw_hide);之后才执行,timer组件也是这样。
我的是自绘的无边框窗口
santiaodahan 2017-02-27
  • 打赏
  • 举报
回复
引用 8 楼 qq_33802316 的回复:
[quote=引用 7 楼 santiaodahan 的回复:] [quote=引用 6 楼 qq_33802316 的回复:] [quote=引用 5 楼 santiaodahan 的回复:] 如果是QQ那种样式的,不需要这么麻烦,直接给lpData赋值就可以:lpData.szTip:='第一行'+#13#10+'第二行'; 托盘区不支持鼠标进入、离开、悬停消息,可以支持鼠标移动消息。
这样是可以。但是我想做一个类似于qq的那种如果有消息到来小图标闪烁鼠标移上去就可以弹出一个消息预览框的那种。 现在鼠标移上去弹出一个框没问题了,在鼠标移开1秒后自动隐藏弹出框这个我想通过timer实现,但是无法启动timer,不知道什么原因[/quote] 动态改变szTip值也可以显示你的预览消息。闪烁的小图标是通过动态显示多个托盘图标实现的:Shell_NotifyIcon(NIM_MODIFY, lpData); 为什么无法启动timer,进入托盘区就打开计时器有何不可。[/quote]我也是想这样做,但是这个timer不晓得怎么回事就是没法启动,当执行showwindow(handle,sw_hide)后他就执行,恢复界面后又不执行了[/quote] 单步调试或贴代码。
qq_33802316 2017-02-27
  • 打赏
  • 举报
回复
引用 7 楼 santiaodahan 的回复:
[quote=引用 6 楼 qq_33802316 的回复:] [quote=引用 5 楼 santiaodahan 的回复:] 如果是QQ那种样式的,不需要这么麻烦,直接给lpData赋值就可以:lpData.szTip:='第一行'+#13#10+'第二行'; 托盘区不支持鼠标进入、离开、悬停消息,可以支持鼠标移动消息。
这样是可以。但是我想做一个类似于qq的那种如果有消息到来小图标闪烁鼠标移上去就可以弹出一个消息预览框的那种。 现在鼠标移上去弹出一个框没问题了,在鼠标移开1秒后自动隐藏弹出框这个我想通过timer实现,但是无法启动timer,不知道什么原因[/quote] 动态改变szTip值也可以显示你的预览消息。闪烁的小图标是通过动态显示多个托盘图标实现的:Shell_NotifyIcon(NIM_MODIFY, lpData); 为什么无法启动timer,进入托盘区就打开计时器有何不可。[/quote]我也是想这样做,但是这个timer不晓得怎么回事就是没法启动,当执行showwindow(handle,sw_hide)后他就执行,恢复界面后又不执行了
santiaodahan 2017-02-27
  • 打赏
  • 举报
回复
引用 6 楼 qq_33802316 的回复:
[quote=引用 5 楼 santiaodahan 的回复:] 如果是QQ那种样式的,不需要这么麻烦,直接给lpData赋值就可以:lpData.szTip:='第一行'+#13#10+'第二行'; 托盘区不支持鼠标进入、离开、悬停消息,可以支持鼠标移动消息。
这样是可以。但是我想做一个类似于qq的那种如果有消息到来小图标闪烁鼠标移上去就可以弹出一个消息预览框的那种。 现在鼠标移上去弹出一个框没问题了,在鼠标移开1秒后自动隐藏弹出框这个我想通过timer实现,但是无法启动timer,不知道什么原因[/quote] 动态改变szTip值也可以显示你的预览消息。闪烁的小图标是通过动态显示多个托盘图标实现的:Shell_NotifyIcon(NIM_MODIFY, lpData); 为什么无法启动timer,进入托盘区就打开计时器有何不可。
santiaodahan 2017-02-24
  • 打赏
  • 举报
回复
如果是QQ那种样式的,不需要这么麻烦,直接给lpData赋值就可以:lpData.szTip:='第一行'+#13#10+'第二行'; 托盘区不支持鼠标进入、离开、悬停消息,可以支持鼠标移动消息。
qq_33802316 2017-02-24
  • 打赏
  • 举报
回复
引用 2 楼 tiankun66 的回复:
WM_MOUSEMOVE $200 就是鼠标移动啊 procedure TForm1.WMNID(var msg: TMessage); begin begin case msg.LParam of WM_LBUTTONUp: Form1.Visible := not Form1.Visible; WM_RBUTTONUP: ShowMessage('您点击的是右键'); WM_MOUSEMOVE: //移动啊; End; Memo1.Lines.Add(DateTimeToStr(Now)+':'+ IntToStr(msg.LParam)); End; end; 只要鼠标移动你就不停的显示你的消息界面,并把消息显示界面的时间不停保持。 当没有鼠标移动事件,你计数器时间到,就自动关闭了
timer没法在消息循环中启动
qq_33802316 2017-02-24
  • 打赏
  • 举报
回复
引用 1 楼 suiyunonghen 的回复:
我记得是有MouseMove消息的,在 MouseMove触发的时候,记录下坐标,做个进入状态,如果没有启动定时器,则启动定时器,然后不断在定时器中判定,如果是进入状态,GetCursorPos获取当前的鼠标位置,和记录的坐标位置比较,如果一致,则说明鼠标没动!只要有移动,其实他会触发MouseMove事件的,然后关闭定时器,鼠标离开了
可是什么时候确定离开状态呢
引用 1 楼 suiyunonghen 的回复:
我记得是有MouseMove消息的,在 MouseMove触发的时候,记录下坐标,做个进入状态,如果没有启动定时器,则启动定时器,然后不断在定时器中判定,如果是进入状态,GetCursorPos获取当前的鼠标位置,和记录的坐标位置比较,如果一致,则说明鼠标没动!只要有移动,其实他会触发MouseMove事件的,然后关闭定时器,鼠标离开了
我明白你的意思了,但是在WndProc里面没法启动定时器,难道是在截取消息的过程中不能执行定时器的启动??
大肚肥肥 2017-02-24
  • 打赏
  • 举报
回复
WM_MOUSEMOVE $200 就是鼠标移动啊 procedure TForm1.WMNID(var msg: TMessage); begin begin case msg.LParam of WM_LBUTTONUp: Form1.Visible := not Form1.Visible; WM_RBUTTONUP: ShowMessage('您点击的是右键'); WM_MOUSEMOVE: //移动啊; End; Memo1.Lines.Add(DateTimeToStr(Now)+':'+ IntToStr(msg.LParam)); End; end; 只要鼠标移动你就不停的显示你的消息界面,并把消息显示界面的时间不停保持。 当没有鼠标移动事件,你计数器时间到,就自动关闭了
不得闲 2017-02-23
  • 打赏
  • 举报
回复
我记得是有MouseMove消息的,在 MouseMove触发的时候,记录下坐标,做个进入状态,如果没有启动定时器,则启动定时器,然后不断在定时器中判定,如果是进入状态,GetCursorPos获取当前的鼠标位置,和记录的坐标位置比较,如果一致,则说明鼠标没动!只要有移动,其实他会触发MouseMove事件的,然后关闭定时器,鼠标离开了

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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