文章参考地址: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. (转)Updates were rejected because the tip of your current branch is behind

    刚创建的github版本库,在push代码时出错: $ git push -u origin masterTo git@github.com:******/Demo.git ! [rejected] ...

  2. asp.net core mvc简介

    MVC 通常而言,我们使用.NET Core MVC 构建网页应用与 API,MVC是使用模型-视图-控制器(Model-View-Controller)设计模式. 创建项目 使用如下命令创建一个名称 ...

  3. VS中的快捷键

    1.代码中追踪函数的详细代码:   F12

  4. hibernate 各历史版本下载 spring各历史版本下载

    hibernate 各历史版本下载http://sourceforge.net/projects/hibernate/files/ spring各历史版本下载http://www.springsour ...

  5. Prolog奇怪奇妙的思考方式

    今天在<七周七语言>中接触到了prolog,发现它的编程模式和思考方式的确比较奇怪,但同时也非常奇妙,值得学习一下. 1. prolog语言介绍     和SQL一样,Prolog基于数据 ...

  6. Linux下创建pycharm的快捷方式

    第一步:创建桌面快捷方式文件Pycharm.desktop,并打开 sudo gedit /usr/share/applications/Pycharm.desktop 第二步:在打开的文件Pycha ...

  7. 关于Vue脚手架写法的问题

    问题描述: main.js import Vue from 'vue' import App from './App' /* eslint-disable no-new */ new Vue({ el ...

  8. PHP的array_merge()合并数组

    ,4];print_r(array_merge($arr1,$arr2));返回结果:Array(    [a] => 3    [b] => 2    [0] => 4)1注释:当 ...

  9. App测试基本流程详解

    1 APP测试基本流程 1.1流程图 1.2测试周期 测试周期可按项目的开发周期来确定测试时间,一般测试时间为两三周(即15个工作日),根据项目情况以及版本质量可适当缩短或延长测试时间. 1.3测试资 ...

  10. Linux复制和移动文件

    cp:复制文件和目录 cp /etc/log /mu 把/etc/log复制到/mu目录下 -r:递归复制目录 -f:强制复制目录或文件 -i:交互式 -p:保留源文件或目录的属性 mv:移动或重命名 ...