文章参考地址:http://blog.csdn.net/txh0001/article/details/38265895http://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. 1. 不在左上角的小区域内放控件
  2. 2. 如果非放不可,那么在隐藏窗体的时候,把盖住左上角的控件先隐藏掉

=============================================================

因为我必须在左上角放控件,所以采用了第二种方法,在Hide之前,把TabStrip控件的Visible属性设为false,在Show之前,把TabStrip的Visible属性设为true,这样就解决了这个问题

不过这样还有点小问题,就是在窗体没有隐藏的时候,托盘图标是没作用的。

============================================================

  1. 方法3: 设置托盘hwnd属性为左上角那个控件的hwnd,然后在那个控件的MouseMove事件里面写处理代码(该方法最有效)

目前发现这个方法最好,甚至在我隐藏了那个控件的时候都有用,真是挺奇怪的。

VB托盘图标不响应WM_MOUSEMOVE的原因及解决方法的更多相关文章

  1. 需要我们了解的SQL Server阻塞原因与解决方法

    需要我们了解的SQL Server阻塞原因与解决方法 上篇说SQL Server应用模式之OLTP系统性能分析.五种角度分析sql性能问题.本章依然是SQL性能 五种角度其一“阻塞与死锁” 这里通过连 ...

  2. jQuery validate插件,自动验证无效的原因及解决方法归纳

    最近在使用validate插件进行验证的时候,出现有的控件在个别事件(比如keydown.foucs.onchange等)下不能自动验证,而有的控件却又正常,当时觉得很诡异,后来仔细测试查看,归纳原因 ...

  3. 动态生成的DOM不会触发onclick事件的原因及解决方法

    最近朋友在做一个项目的时候,遇到动态加载微博内容,然后点击“展开评论”后获取该微博的所有评论.这里使用了动态加载的<span mid='123456789′ class='get_comment ...

  4. coreseek常见错误原因及解决方法

    coreseek常见错误原因及解决方法 Coreseek 中文全文检索引擎 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和 ...

  5. .NET 3.5 安装错误的四个原因及解决方法

    .net framework 3.5 安装错误的四个常见原因及解决方法,飓风软件站整理,转载请注明. 1.清除所有版本 .NET Framework  安装错误后在系统中遗留的文件: 如果您以往安装过 ...

  6. Java ConcurrentModificationException异常原因和解决方法

    Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.u ...

  7. Nginx 502 Bad Gateway 错误的原因及解决方法

    http://my.oschina.net/zhouyuan/blog/118708 刚才在调试程序的时候,居然服务器502错误,昨天晚上也发生了,好像我没有做非常规的操作. 然后网上寻找了下答案, ...

  8. oracle 索引失效原因及解决方法

    oracle 索引失效原因及解决方法 2010年11月26日 星期五 17:10 一.以下的方法会引起索引失效 ‍1,<>2,单独的>,<,(有时会用到,有时不会)3,like ...

  9. Nginx 499错误的原因及解决方法

    今天进行系统维护,发现了大量的499错误, 499错误 ngx_string(ngx_http_error_495_page), /* 495, https certificate error */n ...

随机推荐

  1. Laravel5.x 封装的上传图片类

    图片缩放需要用conposer安装 ImageManagerStatic类 可参考下面的地址安装: https://www.jb51.net/article/128159.htm 控制器里: 控制器里 ...

  2. FireDAC内存表

    procedure TForm1.FormCreate(Sender: TObject); Var i:integer; begin // i:=; self.FDMemTable1.FieldDef ...

  3. python递归函数(计算阶乘)

    def f1(x,x1=1): if x == 1: return x1 #x1这个值为我们所需要的值,所以返回 x1 *= x r = f1(x-1,x1) #r接收返回值,并在下面接着返回 ret ...

  4. ruby 第三方模块unirest使用

    Creating Requests require 'unirest' response = Unirest.post 'http://httpbin.org/post', headers:{ Acc ...

  5. 利尔达NB-IOT的PSM和eDRX低功耗模式笔记

    1. NB-IOT的技术优势,广覆盖,NB-IOT与GPRS和LTE相比较,最大链路预算提升了20dB,相当于提升了100倍,即使在地车车库.地下室.地下管道等普通无线网络信号难以到达的地方也容易覆盖 ...

  6. python内置模块[sys,os,os.path,stat]

    python内置模块[sys,os,os.path,stat] 内置模块是python自带功能,在使用内置模块时,需要遵循 先导入在 使用 一.sys 对象 描述 sys.argv 命令行参数获取,返 ...

  7. jenkins手动安装插件

    插件下载地址: 搜索:https://plugins.jenkins.io/ 列表:https://updates.jenkins-ci.org/download/plugins/ 打开jenkins ...

  8. IDEA 中.properties文件中文自动转Unicode编码及乱码问题

    问题描述: 在使用IDEA开发工具编辑属性文件(.properties)的时候出现中文自动转成了Unicode编码,或在读取属性文件的时候中文出现乱码. 问题解决: 进入 File -> Set ...

  9. 基于HTML5移动web应用

    一.基于HTML5移动web应用 1.canvas 绘图 2.多媒体 3.本地存储 4.离线应用 5.使用地理位置 6.移动web框架   二.具体说明 1.HTML5标准最大的变化就是支持Web绘图 ...

  10. ubuntu安装显卡驱动和cuda

    NVIDIA-linux.run安装后,会出现登录页面循环,解决办法是在运行命令后加入-no-opengl-files 打开nvidia x server Settings软件,显示:You do n ...