VB托盘图标不响应WM_MOUSEMOVE的原因及解决方法
文章参考地址:http://blog.csdn.net/txh0001/article/details/38265895;http://bbs.csdn.net/topics/330106030
网上关于VB做托盘图标的文章很多,基本上有两种方法,一种是使用控件SysTray,需要添加"System Tray Icon Control",由于我一开始没有找到这个部件,所以没用第一种方法.
第二种方法是利用API函数Shell_NotifyIcon来实现(其实第一种方法估计也是用了这个API,只不过VB帮我们封装好了而已).网上的代码也以这种类型的居多,由于网上相关代码太多,这里就不全部列出来了,以下是最主要的一个函数,功能是添加托盘图标
Public Sub AddTrayIcon()
With Mynid
.cbSize = Len(Mynid)
.hIcon = frmSetting.Icon '托盘的图标和frmSetting窗体的图标一致
.hwnd = frmSetting.hwnd '托盘的句柄等于frmSetting窗体的句柄,其实就是托盘图标上发生的事件转发给这个frmSetting窗体
.szTip = "VB语法着色器" & vbNullChar '鼠标放到托盘图标上显示的文字
.ucallbackMessage = WM_MOUSEMOVE '托盘图标响应的事件,一般就是WM_MOUSEMOVE,鼠标的其它事件都从这个事件来判断,这个地方我也没弄明白,反正就是无论鼠标移动,按下,抬起,双击,右键,中键,这些事件都会发送WM_MOUSEMOVE这个消息
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.uId = 0
End With
Call Shell_NotifyIcon(NIM_ADD, Mynid) '显示托盘图标
End Sub
从网上下载或者拷贝的源码,都可以正常实现功能,而当我把这个功能结合到我自己的程序上的时候,总共试了三次,一次可以,另外两次都无法触发Form_MouseMove事件
经过长时间的摸索,外加灵光一闪,找到了问题所在
原来是因为我的窗体(如上面的frmSetting)上面放满了控件(我的frmSetting上放了一个和窗体一样大的TabStrip控件),把整个窗体都盖住了,所以Form_MouseMove这个事件根本就无法触发.
想到这里,就可以大胆假设托盘图标其实是相当于截取指定窗体的一部分,或者是这个窗体的缩小版,如果窗体无法发出的消息,那么托盘图标也无法发出.
事实证明,这个想法是相当的正确,基本可以肯定,托盘图标其实就是截取了指定窗体左上角的一小块和托盘图标一样大小的区域,只要这个区域能触发Form_MouseMove,那么托盘图标也就可以
=============================================================
解决方法如下:
- 1. 不在左上角的小区域内放控件
- 2. 如果非放不可,那么在隐藏窗体的时候,把盖住左上角的控件先隐藏掉
=============================================================
因为我必须在左上角放控件,所以采用了第二种方法,在Hide之前,把TabStrip控件的Visible属性设为false,在Show之前,把TabStrip的Visible属性设为true,这样就解决了这个问题
不过这样还有点小问题,就是在窗体没有隐藏的时候,托盘图标是没作用的。
============================================================
- 方法3: 设置托盘hwnd属性为左上角那个控件的hwnd,然后在那个控件的MouseMove事件里面写处理代码(该方法最有效)
目前发现这个方法最好,甚至在我隐藏了那个控件的时候都有用,真是挺奇怪的。
VB托盘图标不响应WM_MOUSEMOVE的原因及解决方法的更多相关文章
- 需要我们了解的SQL Server阻塞原因与解决方法
需要我们了解的SQL Server阻塞原因与解决方法 上篇说SQL Server应用模式之OLTP系统性能分析.五种角度分析sql性能问题.本章依然是SQL性能 五种角度其一“阻塞与死锁” 这里通过连 ...
- jQuery validate插件,自动验证无效的原因及解决方法归纳
最近在使用validate插件进行验证的时候,出现有的控件在个别事件(比如keydown.foucs.onchange等)下不能自动验证,而有的控件却又正常,当时觉得很诡异,后来仔细测试查看,归纳原因 ...
- 动态生成的DOM不会触发onclick事件的原因及解决方法
最近朋友在做一个项目的时候,遇到动态加载微博内容,然后点击“展开评论”后获取该微博的所有评论.这里使用了动态加载的<span mid='123456789′ class='get_comment ...
- coreseek常见错误原因及解决方法
coreseek常见错误原因及解决方法 Coreseek 中文全文检索引擎 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和 ...
- .NET 3.5 安装错误的四个原因及解决方法
.net framework 3.5 安装错误的四个常见原因及解决方法,飓风软件站整理,转载请注明. 1.清除所有版本 .NET Framework 安装错误后在系统中遗留的文件: 如果您以往安装过 ...
- Java ConcurrentModificationException异常原因和解决方法
Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...
- Nginx 502 Bad Gateway 错误的原因及解决方法
http://my.oschina.net/zhouyuan/blog/118708 刚才在调试程序的时候,居然服务器502错误,昨天晚上也发生了,好像我没有做非常规的操作. 然后网上寻找了下答案, ...
- oracle 索引失效原因及解决方法
oracle 索引失效原因及解决方法 2010年11月26日 星期五 17:10 一.以下的方法会引起索引失效 1,<>2,单独的>,<,(有时会用到,有时不会)3,like ...
- Nginx 499错误的原因及解决方法
今天进行系统维护,发现了大量的499错误, 499错误 ngx_string(ngx_http_error_495_page), /* 495, https certificate error */n ...
随机推荐
- 构造HTTP请求Header实现“伪造来源IP”
在阅读本文前,大家要有一个概念,在实现正常的TCP/IP 双方通信情况下,是无法伪造来源 IP 的,也就是说,在 TCP/IP 协议中,可以伪造数据包来源 IP ,但这会让发送出去的数据包有去无回,无 ...
- ECSHOP和SHOPEX快递单号查询申通插件V8.6专版
发布ECSHOP说明: ECSHOP快递物流单号查询插件特色 本ECSHOP快递物流单号跟踪插件提供国内外近2000家快递物流订单单号查询服务例如申通快递.顺丰快递.圆通快递.EMS快递.汇通快递.宅 ...
- memcached搭建
MemCache 安装使用 安装memcached之前首先需要安装libevent, 如果没有安装的请自行去安装. 下载memcache http://www.memcached.org/files/ ...
- 【Hbase一】基础
此笔记仅用于作者记录复习使用,如有错误地方欢迎留言指正,作者感激不尽,如有转载请指明出处 Hbase基础 Hbase基础 Hbase定义 行存储 v s 列存储 Hbase数据模型 Hbase物理模型 ...
- 移植Linux Kernel SM750 驱动到VxWorks 7
一.SM750简介 SM750 是SiliconMotion 推出的一款适合嵌入式设备的显卡(Embedded GPU),采用PCIe接口与CPU连接,内部集成16MB DDR SDRAM显存,产品具 ...
- docker使用命令汇总
docker命令 docker ps 容器列表 docker ps -a 所有容器列表,包含未运行的容器 docker image ls 镜像列表 docker logs -f xxx 容器日志 do ...
- 【Leetcode】413. Arithmetic Slices
Description A sequence of number is called arithmetic if it consists of at least three elements and ...
- 45-Identity MVC:注册逻辑实现
1-注册页Register.cshtml <h3>Register</h3> @model MvcCookieAuthSample.ViewModel.RegisterView ...
- linux io 学习笔记(02)---条件变量,管道,信号
条件变量的工作原理:对当前不访问共享资源的任务,直接执行睡眠处理,如果此时需要某个任务访问资源,直接将该任务唤醒.条件变量类似异步通信,操作的核心:睡眠.唤醒. 1.pthread_cond_t 定 ...
- sqoop 的使用 -20160410
1 导入导出数据库 1)列出mysql数据库中的所有数据库命令 # sqoop list-databases --connect jdbc:mysql://localhost:3306/ - ...