开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6647|回复: 5
收起左侧

[已回应] 托盘类气泡通知的bug,包含代码改进

[复制链接]
发表于 2022-10-13 21:13:21 | 显示全部楼层 |阅读模式   江西省赣州市
本帖最后由 UltrSeven 于 2022-10-13 22:43 编辑

在自制的程序内用过精易的托盘类之后发现,只要使用过一次气泡通知,那么每次更新托盘文本或图标时会自动弹出上一次的气泡提示。研究过MSDN的文档后发现,托盘结构体下的uFlags成员决定了托盘图标的动作,也就是说问题出现在这里了。
精易模块内的托盘类在创建函数时
  
如果真 (IsWindow (窗口句柄) = 1)
集_窗口句柄 = 窗口句柄
如果 (是否为空 (图标数据))
集_通知结构.hIcon = SendMessageA (窗口句柄, 127, 0, 0)
集_通知结构.hIcon = 取图标句柄 (图标数据)
集_通知结构.cbSize = 488
集_通知结构.hWnd = 窗口句柄
集_通知结构.uID = 1
集_通知结构.uFlags = 位或 ( #NIF_ICON, #NIF_TIP, #NIF_INFO, #NIF_MESSAGE )
集_通知结构.uCallbackMessage = 11685
集_通知结构.uTimeoutAndVersion = 10000
lstrcpyA (集_通知结构.szTip, 提示信息)
返回 (Shell_NotifyIconA ( #NIM_ADD, 集_通知结构))
返回 ()

集_通知结构.uFlags 这里得到的动作是 位或 ( #NIF_ICON, #NIF_TIP, #NIF_INFO, #NIF_MESSAGE ),但实际上创建托盘图标时并不存在气泡提示动作NIF_INFO(即使需要气泡提示逻辑上也完全可以由之后的子程序完成),所以在此处的实际值应该为 位或 ( #NIF_ICON, #NIF_TIP,#NIF_MESSAGE ),#NIF_INFO表示的是气泡提示的有效性。
既然气泡提示在创建时被无效,那么 集_通知结构.uTimeoutAndVersion = 10000 该语句也无意义(气泡持续时间,在气泡提示的子程序中有对该成员赋值的动作)


顺带一提的是 集_通知结构.uCallbackMessage 这里的值应该通过API RegisterWindowMessage() 来获取
做出对应更改后在 挂接事件 子程序中
SetPropA (集_窗口句柄, “CallbackMessage”, 11685)
应更改为
SetPropA (集_窗口句柄, “TaskbarCallbackMessage”, 集_通知结构.uCallbackMessage)

创建函数的改进建议如下
  
子程序名返回值类型公开备 注
创建逻辑型 创建一个托盘图标,成功返回真,失败返回假。
参数名类 型参考可空数组备 注
窗口句柄不能设为第三方窗口
图标数据字节集可为空,默认为自身图标。
提示信息文本型本参数指定当鼠标移动到图标上后显示的提示信息。如果省略本参数,默认为空文本。
如果真 (IsWindow (窗口句柄) = 1)
集_窗口句柄 = 窗口句柄
如果 (是否为空 (图标数据))
集_通知结构.hIcon = SendMessageA (窗口句柄, 127, 0, 0)
集_通知结构.hIcon = 取图标句柄 (图标数据)
集_通知结构.cbSize = 488
集_通知结构.hWnd = 窗口句柄
集_通知结构.uID = 1
集_通知结构.uFlags = 位或 ( #NIF_ICON, #NIF_TIP, #NIF_MESSAGE )
集_通知结构.uCallbackMessage = RegisterWindowMessage ("TaskbarCallbackMessage")
lstrcpy_bytes (集_通知结构.szTip, 提示信息)
返回 (Shell_NotifyIcon ( #NIM_ADD, 集_通知结构))
返回 ()







精易模块v10.4.0[源码].zip

1.15 MB, 下载次数: 15, 下载积分: 精币 -2 枚

评分

参与人数 2好评 +1 精币 +1 收起 理由
Daen + 1 感谢分享,很给力!~
Suky + 1 感谢分享,很给力!~

查看全部评分

结帖率:0% (0/1)
发表于 2023-2-24 16:46:44 | 显示全部楼层   河北省秦皇岛市
谢谢分享,学习技能中
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 12 天

发表于 2022-11-2 08:30:31 | 显示全部楼层   湖北省仙桃市
能分享个带托盘的菜单示例,谢谢。
回复 支持 反对

使用道具 举报

发表于 2022-10-14 10:12:47 | 显示全部楼层   河南省焦作市
谢谢楼主分享!!!
好人一生平安!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-13 22:11:06 | 显示全部楼层   江西省赣州市
本帖最后由 UltrSeven 于 2022-10-13 22:23 编辑

这楼应该是3楼- -,BBS用得少不太会发帖

那么子程序 置提示信息置图标数据 也应该在使用时指定其有效范围(指的是排除气泡通知,毕竟你也不想在修改信息或图标的时候弹出气泡通知对吧,这是明显的bug了解决方法也很简单,只需要在
子程序返回之前将uFlags改为 位或 ( #NIF_ICON, #NIF_TIP,#NIF_MESSAGE )

集_通知结构.uFlags = 位或 ( #NIF_ICON, #NIF_TIP,#NIF_MESSAGE )
而非模块内原来的
集_通知结构.uFlags = 位或 ( #NIF_ICON, #NIF_TIP, #NIF_INFO, #NIF_MESSAGE )
即可修复问题。

望项目部采纳
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-13 22:03:44 | 显示全部楼层   江西省赣州市
再来看气泡提示
  
集_通知结构.dwInfoFlags = 提示图标
m_szInfoTitle = 选择 (取文本长度 (提示标题) ≤ 64, 提示标题, 取文本左边 (提示标题, 64))
m_szInfo = 选择 (取文本长度 (提示内容) < 256, 提示内容, 取文本左边 (提示内容, 256))
lstrcpyA (集_通知结构.szInfoTitle, m_szInfoTitle)
lstrcpyA (集_通知结构.szInfo, m_szInfo)
判断 (显示时间 = 0)
集_通知结构.uTimeoutAndVersion = 3000
集_通知结构.uTimeoutAndVersion = 显示时间
返回 (Shell_NotifyIconA ( #NIM_MODIFY, 集_通知结构))


在这个子程序里,使得气泡提示出现,在Shell_NotifyIconA ( #NIM_MODIFY, 集_通知结构)之前,我们应该使之生效,所以在前面应指定uFlags的值
uFlags=位或 (#NIF_ICON, #NIF_TIP, #NIF_INFO, #NIF_MESSAGE)
同时使得之前的三项(图标,提示文本,消息)与气泡提示#NIF_INFO一同生效
  
子程序名返回值类型公开备 注
气泡提示逻辑型 
参数名类 型参考可空数组备 注
提示标题文本型限定64字符以内,超出默认被截断
提示内容文本型限定256字符以内,超出默认被截断
提示图标整数型0.托盘图标_无图标,1.托盘图标_信息图标,2.托盘图标_警告图标,3.托盘图标_错误图标
显示时间整数型设置气泡提示的时间,单位:毫秒 可空 默认3秒
变量名类 型静态数组备 注
m_szInfo文本型 
m_szInfoTitle文本型 
集_通知结构.dwInfoFlags = 提示图标
m_szInfoTitle = 选择 (取文本长度 (提示标题) ≤ 64, 提示标题, 取文本左边 (提示标题, 64))
m_szInfo = 选择 (取文本长度 (提示内容) < 256, 提示内容, 取文本左边 (提示内容, 256))
lstrcpy_bytes (集_通知结构.szInfoTitle, m_szInfoTitle)
lstrcpy_bytes (集_通知结构.szInfo, m_szInfo)
判断 (显示时间 = 0)
集_通知结构.uTimeoutAndVersion = 3000
集_通知结构.uTimeoutAndVersion = 显示时间
集_通知结构.uFlags = 位或 ( #NIF_ICON, #NIF_TIP, #NIF_INFO, #NIF_MESSAGE )
返回 (Shell_NotifyIcon ( #NIM_MODIFY, 集_通知结构))



回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表