vb 托盘

'下面是此功能的实现步骤:    
'1.这里我们调用的API函数是:    
' "Shell_NotifyIcon ",在您的模块中添加如下的函    
'数声明和常量声明:    
'以下常量告诉系统在托盘中您的图标上发生了什么     操作    
'常量声明    
Public     Const     WM_MOUSEMOVE     =     &H200     '在图标上移动鼠标    
Public     Const     WM_LBUTTONDOWN     =     &H201     '鼠标左键按下    
Public     Const     WM_LBUTTONUP     =     &H202     '鼠标左键释放    
Public     Const     WM_LBUTTONDBLCLK     =     &H203     '双击鼠标左键    
Public     Const     WM_RBUTTONDOWN     =     &H204     '鼠标右键按下    
Public     Const     WM_RBUTTONUP     =     &H205     '鼠标右键释放    
Public     Const     WM_RBUTTONDBLCLK     =     &H206     '双击鼠标右键    
Public     Const     WM_SETHOTKEY     =     &H32     '响应您定义的热键    
'API函数声明    
Public     Declare     Function     Shell_NotifyIcon     Lib     "shell32.dll "     Alias     " "     ()    
Shell_NotifyIconA     "     (ByVal     dwMessage     As     Long,     lpData     As     NOTIFYICONDATA)     As     Long     "    
'自定义一个调用API     Shell_NotifyIcon要用到的类     型 "NOTIFYICONDATA "    
Public     Type     NOTIFYICONDATA    
cdSize     As     Long     'NOTIFYICONDATA类型的大小    
hwnd     As     Long     '你的应用程序窗体的名柄    
uId     As     Long     '应用程序图标资源的ID号    
uFlags     As     Long     '使那些参数有效它是以下枚举类型中的    
'NIF_MESSAGE、NIF_ICON、NIF_TIP三组的组合    
uCallbackMessage     As     Long     '鼠标移动时把此消息发给该图标的窗体    
hIcon     As     Long     '图标名柄    
szTip     As     String     *     64     '当鼠标在图标上时显示的Tip文本    
End     Type    
 
'这是一个枚举类型它告诉API     Shell_NotifyIcon去做什么操作    
Public     Enum     enm_NIM_Shell    
NIM_ADD     =     &H40     '在“金碟”中加一图标    
NIM_MODIFY     =     &H1     '修改“金碟”中的图标    
NIM_DELETE     =     &H2     '删除“金碟”中的图标    
NIF_MESSAGE     =     &H1     '使类型 "NOTIFYICONDATA "中的uCallbackMessage有效    
NIF_ICON     =     &H2     '使类型 "NOTIFYICONDATA "中的hIcon有效    
NIF_TIP     =     &H4     '使类型 "NOTIFYICONDATA "中的szTip有效    
WM_MOUSEMOVE     =     &H200     '使鼠标移动消息有效    
End     Enum    
'定义一个 "NOTIFYICONDATA "类型的变量    
Public     nidProgramData     As     NOTIFYICONDATA    
 
'以上是函数及常量声明和自定义的一个类型变量,下面是此API函数的调用方法:    
'2.     在窗体上用菜单编辑一个具有如下信息的菜单项:    
'主菜单:     无标题、名称     (mainMenu)    
'子菜单:标题(API编程)、名称(submnul);    
'标题(退出)、名称(submnu2).    
'这里只是举个例子,具体的功能你可以根据你的具体需要来编辑此菜单项    
'3.     在窗体的Load事件中添加如下代码:    
Private     Sub     Form_Load()    
'隐藏窗体    
With     Me    
              .Top     =     -10000    
              .Left     =     -10000    
              .WindowState     =     vbMinimized    
End     With    
'设置类型NOTIFYICONDATA所具有的特征    
With     nidProgramData    
              .cbSize     =     Len(nidProgramData)    
              .hwnd     =     Me.hwnd    
              .uld     =     vbNull    
              .uFlags     =     NIF_ICON     Or     NIF_TIP     Or     NIF_MESSAGE    
              '触发鼠标移动消息    
              .uCallbackMessage     =     WM_MOUSEMOVE    
              .hIcon     =     Me.Icon    
              '“托盘”中放入窗体图标,你可以把窗体的图标换成你所喜欢的图标    
              .szTip     =     "VB     的     Win32     API     编程 "     &     vbNullChar    
End     With    
 
'调用该函数    
Shell_NotifyIcon     NIM_ADD,     nidProgramData    
End     Sub    
'根据不同的鼠标消息做不同的操作    
Private     Sub     Form_MouseMove(Button     As     Integer,     Shift     As     lnteger,     x     As     Single,     Y     As     Single)    
On     Error     GoTo     Form_MouseMove_err:    
Dim     Result     As     Long    
Dim     msg     As     Long    
'X的值依赖与显示模式的设置    
If     Me.ScaleMode     =     vbPixels     Then    
              msg     =     x    
Else    
              msg     =     x     /     Screen.TwipsPerPixe1X    
End     If    
Select     Case     msg    
              Case     WM_LBUTTONUP    
              '在这里加入鼠标左键释放时你想做的操作    
              Case     WM_LBUTTONDBLCLK    
              '在这里加入双击鼠标左键时你想做的操作    
              Case     WM_RBUTTONUP    
              '通常这里弹出你的功能菜单    
              PopupMenu     mainMenu    
              Case     WM_MOUSEISMOVING    
              '在这里加入鼠标正在移动时你想做的操作    
              End     Select    
Exit     Sub    
 
Form_MouseMove_err:    
'在这里加入你的处理异常错误的代码    
End     Sub    
'4.Run你的程序,您是不是看到了象“金山词霸”一样的功能?相信你此时的感觉一定特别“爽”!     API的世界j是丰富多彩的,只要你肯细心地去探索它你一定会获得许多意想不到的好东西。所以笔者觉得定值得每一个具有“好奇”精神的人去探索它。后续的期刊笔者会向读者详细介绍一些更好更“牛”的API调用。    
 
---------------------------------------------------------------    
 
在WINDOWS98里,右下角有许多应用程序的图标。而程序本身的窗口是隐藏的,若你需要调用应用程序的窗口,则双击该图标即可。这种程序称为托盘程序。这是WINDOWS98操作系统的一大特色。使用户能够更加快捷的显示和隐藏应用程序,可以使任务栏不致于太乱。托盘程序在Visual     Basic里是怎么实现的呢?        
    编写托盘程序主要解决两个问题:(1)创建、修改、删除托盘;(2)如何对托盘接收到的消息进行处理。这就要用到几个Windows     API函数。        
    首先,Shell_NotifyIcon是用于托盘的Shell     API。该API用到一个NOTIFYICONDATA结构.        
  Type     NOTIFYICONDATA        
        cbSize     As     Long     '该结构所占字节数        
        hwnd     As     Long     '接收托盘图标消息的窗口指针        
        uID     As     Long     '由程序定义的图标识别符,因为有的程序有多个图标        
        uFlags     As     Long     '对托盘图标操作的标志,包括添加、删除、修改        
        uCallbackMessage     As     Long     '标志应用程序的消息        
        hIcon     As     Long     '托盘图标指针        
        szTip     As     String     *     64     '当鼠标指到托盘图标时提示字符串        
  End     Type        
    其次,应该考虑怎样在VB中接收、处理托盘的消息(双击、单击、左键、右键)。C++、Delphi等语言对消息循环的处理较简单,但在VB中处理消息循环时必须应用Win32的SetWindowLong、CallWindowProc这两个API函数。SetWindowLong     函数利用GWL_WNDPROC     索引来创建窗口类的子类(窗口类是用来创建窗口的),它使用AddressOf关键字和回调函数(WindowProc)来截取消息并根据消息来执行相应的功能,如窗口的最大化、最小化、隐藏、退出等。CallWindowProc函数调用原窗口类缺省的指针,程序最后退出时可通过SetWindowLong来关闭子类,重新使原来的Windows过程成为回调函数。        
    本程序项目包括一个模块和一个窗体        
    1、模块源代码为:        
       Option     Explicit     '强制定义每个使用的变量        
        Type     NOTIFYICONDATA     '定义结构NOTIFYICONDATA        
         cbSize     As     Long        
         hwnd     As     Long        
         uID     As     Long        
         uFlags     As     Long        
         uCallbackMessage     As     Long        
         hIcon     As     Long        
         szTip     As     String     *     64        
        End     Type        
     '以下为     Shell_NotifyIcon将用到的常量        
    Public     Const     NIF_ICON     =     &H2        
    Public     Const     NIF_MESSAGE     =     &H1        
    Public     Const     NIF_TIP     =     &H4        
    Public     Const     NIM_ADD     =     &H0        
    Public     Const     NIM_DELETE     =     &H2        
    Public     Const     NIM_MODIFY     =     &H1        
     'Shell_NotifyIcon的函数声明        
    Declare     Function     Shell_NotifyIcon     Lib     "shell32.dll "     Alias     "Shell_NotifyIconA "        
    (ByVal     dwMessage     As     Long,     lpData     As     NOTIFYICONDATA)     As     Long        
       '处理消息将用到的结构、常量、API声明        
    Type     POINTAPI        
         x     As     Long        
         y     As     Long        
    End     Type        
    Type     Msg        
         hwnd     As     Long        
         message     As     Long        
         wParam     As     Long        
         lParam     As     Long        
         time     As     Long        
         pt     As     POINTAPI        
    End     Type        
         Public     Const     WM_USER     =     &H400        
  Public     Const     WM_RBUTTONDOWN     =     &H204        
  Public     Const     WM_LBUTTONDBLCLK     =     &H203        
    Public     Const     GWL_WNDPROC     =     -4        
    Public     trayflag     As     Boolean     '定义托盘图标是否在桌面上        
    Global     lpPrevWndProc     As     Long        
    Global     gHW     As     Long        
  Declare     Function     CallWindowProc     Lib     "user32 "     Alias     "CallWindowProcA "     (ByVal     lpPrevWndFunc     As     Long,     ByVal     hwnd     As     Long,     ByVal     Msg     As     Long,     ByVal     wParam     As     Long,     ByVal     lParam     As     Long)     As     Long        
  Declare     Function     SetWindowLong     Lib     "user32 "     Alias     "SetWindowLongA "     (ByVal     hwnd     As     Long,     ByVal     nIndex     As     Long,     ByVal     dwNewLong     As     Long)     As     Long        
       '以下过程为消息循环处理        
  Function     WindowProc(ByVal     hw     As     Long,     ByVal     uMsg     As     Long,     ByVal     wParam     As     Long,     ByVal     lParam     As     Long)     As     Long        
   If     hw     =     Form1.hwnd     And     uMsg     =     WM_USER+100     Then '检测到鼠标点动托盘图标        
        Select     Case     lParam        
              Case     WM_RBUTTONDOWN     '鼠标右键按下        
         Form1.PopupMenu     Form1.mainmenu     '弹出菜单        
        Case     WM_LBUTTONDBLCLK     '鼠标左键双击        
       Form1.Show     '显示窗口        
        Case     Else        
        End     Select        
   Else     '调用缺省窗口指针        
         WindowProc     =     CallWindowProc(lpPrevWndProc,     hw,uMsg,     wParam,     lParam)        
       End     If        
  End     Function        
  Public     Sub     hook()     '将程序勾入消息环中        
       '利用Address
Private   Const   NIM_ADD   =   &H0
Private   Const   NIM_DELETE   =   &H2
Private   Const   WM_MOUSEMOVE   =   &H200
Private   Const   NIF_MESSAGE   =   &H1
Private   Const   NIF_ICON   =   &H2
Private   Const   NIF_TIP   =   &H4
Private   Const   WM_LBUTTONDBLCLK   =   &H203
Private   Const   WM_RBUTTONUP   =   &H205
Private   Const   WM_LBUTTONDOWN   =   &H201
Private   Const   WM_LBUTTONUP   =   &H202
Private   Type   NOTIFYICONDATA
                cbSize   As   Long
                hWnd   As   Long
                uID   As   Long
                uFlags   As   Long
                uCallbackMessage   As   Long
                hIcon   As   Long
                szTip   As   String   *   10
End   Type
Private   Declare   Function   Shell_NotifyIcon   Lib   "shell32 "   (ByVal   dwMessage   As   Long,   lpData   As   NOTIFYICONDATA)   As   Boolean
Dim   nid   As   NOTIFYICONDATA

Private   Sub   Form_Load()
Dim   sTip   As   String
Dim   nid   As   NOTIFYICONDATA
nid.szTip   =   "托盘程序 "
nid.cbSize   =   LenB(nid)
nid.hWnd   =   Me.hWnd
nid.uID   =   0
nid.hIcon   =   Me.Icon.Handle
nid.uCallbackMessage   =   WM_MOUSEMOVE
nid.uFlags   =   NIF_ICON   Or   NIF_MESSAGE   Or   NIF_TIP
Shell_NotifyIcon   NIM_ADD,   nid

Me.Hide
End   Sub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值