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 ...
随机推荐
- z-blog博客组插件openSug.js百度搜索下拉框提示代码
z-blog安装openSug插件即可获得带有“搜索框提示”功能的搜索框,让z-blog搜索更便捷! https://www.opensug.org/.../opensug_z-blog_v1.0 ...
- 商城项目:商品列表ajax加载,ajax加入购物车--五张表的联合查询
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ProductLists.a ...
- 内存泄漏导致程序killed
示例程序: #include<stdio.h> #include<unistd.h> int main() { ) { *]; } ; } 执行结果: 程序消耗完内存会被kil ...
- shell重温---基础篇(流程控制&if判断&for&while&循环操作)
和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search( ...
- python2.7入门---循环语句(for&嵌套循环)
咱们直接先来看for循环.Python for循环可以遍历任何序列的项目,如一个列表或者一个字符串.然后再来看一下它的语法结构: for iterating_var in sequence: ...
- 教你Zbrush 4R7怎样创建Z球
随着CG行业的迅猛发展,就业门槛大幅度提高,对于从业人员要求就是要“又快又好”,作为一个模型师,常会碰到一天或两天完成一个全身角色的考题,而且还需要角度摆出造型,以前做这个的话,可能比较难,现在有了Z ...
- Python标准库--inspect
inspect模块是针对模块,类,方法,功能等对象提供些有用的方法.例如可以帮助我们检查类的内容,检查方法的代码,提取和格式化方法的参数等. import inspect import os clas ...
- P1794 装备运输_NOI导刊2010提高(04)
P1794 装备运输_NOI导刊2010提高(04) 题目描述 德国放松对英国的进攻后,把矛头指向了东边——苏联.1943年初,东线的战斗进行到白热化阶段.据可靠情报,90余万德国军队在库尔斯克准备发 ...
- Remote X11 GUI for Linux/Unix
摘自:https://www.redwireservices.com/remote-x11-for-linux-unix The Problem One of my most feared quest ...
- OpenCV入门:(三:图片Mask operations)
Mask operations 翻译为中文应该是掩模操作,具体操作步骤就是根据一个操作矩阵(又名kernel)处理图片中的每一个像素点,操作矩阵会根据当前像素点的周围像素来调整当前像素值. 1.示例 ...