VB托盘图标不响应WM_MOUSEMOVE的原因及解决方法

文章参考地址: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事件里面写处理代码(该方法最有效)

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

你可能感兴趣的:(move)