用VB编写托盘程序

2016-02-19 15:46 5 1 收藏

今天图老师小编给大家展示的是用VB编写托盘程序,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

【 tulaoshi.com - 编程语言 】

  在WINDOWS里,右下角有许多应用程序的图标。而程序本身的窗口是隐藏的,若你需要调用应用程序的窗口,则双击该图标即可。这种程序称为托盘程序。这是WINDOWS98操作系统的一大特色。使用户能够更加快捷的显示和隐藏应用程序,可以使任务栏不致于太乱。托盘程序在Visual Basic里是怎么实现的呢?

  编写托盘程序主要解决两个问题:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  (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 = &H r   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()

  将程序勾入消息环中

  利用AddressOf取得消息处理函数WindowProc的指针,并将其传给SetWindowLong

  lpPrevWndProc用来存储原窗口的指针

  

  lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)    End Sub    Public Sub Unhook()

  将程序从消息环退出。用原窗口的指针替换WindowProc函数的指针,即关闭子类、退 出消息循环

  

  Dim temp As Long    temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)    End Sub

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  2、在窗口form1加入一个主菜单mainmenu,设置为不可见。在加入一些子菜单如" 显示窗口"(名称为:show),"隐藏窗口"(名称为:hide),退出程序"(名称为:exit)。 在加入四个按钮Command1,Command2,Command3,Command。caption属性分别为:"删除托 盘图标","创建托盘图标","修改托盘图标","退出程序".

  代码窗口的内容为:

  Dim MyNot As NOTIFYICONDATA 定义一个托盘结构

  Private Sub Command1_Click()

  按下删除托盘图标按钮

  

  With MyNot      .hIcon = Form1.Icon 托盘图标指针指向窗口的图标      .hwnd = Form1.hwnd 窗体指针      .szTip = "" 弹出提示字符串,删除时应为空      .uCallbackMessage = WM_USER + 100 对应程序定义的消息      .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE 图标标志      .uID = 1 图标识别符      .cbSize = Len(MyNot) 计算结构实例MyNot的长度    End With    hh = Shell_NotifyIcon(NIM_DELETE, MyNot) 删除该托盘图标    trayflag = False 托盘图标删除后trayflag为假    End Sub    Private Sub Command2_Click() 按下创建托盘图标按钮    Dim hh As Long    With MyNot      .hIcon = Form1.Icon      .hwnd = Form1.hwnd      .szTip = "托盘图标" & Chr(&H0)      .uCallbackMessage = WM_USER + 100      .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE      .uID = 1      .cbSize = Len(MyNot)    End With    hh = Shell_NotifyIcon(NIM_ADD, MyNot) 添加一个托盘图标    trayflag = True 托盘图标添加后trayflag为真    End Sub    Private Sub Command3_Click() 按下修改托盘图标按钮    Dim hh As Long    Set P = LoadPicture("cd.ico") 导入一个新图标    With MyNot      .hIcon = P 将托盘图标改为新图标      .hwnd = Form1.hwnd      .szTip = "光盘图标" & Chr(&H0) 更改提示信息      .uCallbackMessage = WM_USER + 100      .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE      .uID = 1      .cbSize = Len(MyNot)    End With    hh = Shell_NotifyIcon(NIM_MODIFY, MyNot) 修改托盘图标的某些特征    End Sub    Private Sub Command4_Click() 退出窗口按钮被按下    If trayflag = True Then Command1_Click 如果托盘图标仍在,模拟按下"删 除托盘图标"按钮    Unhook 退出消息循环    Unload Me 卸载窗体    End Sub    Private Sub exit_Click()    If trayflag = True Then Command1_Click 如果托盘图标仍在,模拟按下"删除托 盘图标"按钮    Unhook 退出消息循环    Unload Me 卸载窗体    End Sub    Private Sub Form_Load()    gHW = Me.hwnd 取得本窗体指针    hook 调用钩子函数,将自制消息处理函数钩入Windows的消息循环    End Sub    Private Sub hide_Click()    Form1.hide 隐藏窗口    End Sub    Private Sub show_Click()    Form1.show 显示窗口    End Sub

  在VB中编译这个程序,点击创建托盘图标。则在任务栏的右下角出现在一图标。 将鼠标放在此图标上,则显示一条信息。点击右键,弹出菜单,可以选择相应的功能执 行的。当窗口隐藏时双击托盘图标可显示窗口。注意:在VB中使用函数指针将使程序变 得脆弱,在运用与其相关的函数及关键字时要多加小心。

来源:https://www.tulaoshi.com/n/20160219/1610387.html

延伸阅读
笔者最近在网上搜索了一些关于VB.net实现关机、重启、注销的文章,发现大多介绍的是VB.NET2003用API实现这些功能,且在XPsp2环境下无法正常的关机与注销。而对于VB.NET2005的介绍几乎没有。本文章所涉及的知识点有: 1.用vb.net实现关机、重启、注销功能 2.通过使用textbox与timer控件的结合编写定时器功能。 3.为你...
编写快速高效的Windows程序是我们的实际需要。当前越来越多的专业和非专业编程人员都倾向于用VB来编写一些Windows下的应用软件。但不可否认:VB所写的应用软件由于不是真编译代码,逊色于用C++和后起之秀Delphi编写的应用程序。以下参考有关资料并结合日常的使用经验,来谈谈如何在最大程度上弥补VB的这些不足,从而写出更加有效的Windows程序...
标签: ASP
  前几天大哥对我说,使用asp真麻烦,编译环境实在是差劲,他总是在vb里面写好调试好代码然后在把代码粘贴到asp程序中,为此,我在这提出一个解决之道。使用VB接替ASP所有的对象,在VB中编写纯粹的ASP程序。 大家应该都知道,其实asp中的好多组件都是使用VB编写出来的,但是让大家感到很不方便的是如何使用asp固有的几个组件,例如Re...
我们都知道,在进入Windows操作系统时会出现一个登录对话框,要求用户输入密码后才能进入Windows。我们用VB也可以编写这样的登录窗口,其具体方法如下: 界面设计: 打开“VB6.0”,出现“新建工程”对话框,选择“标准EXE”单击“打开”即可新建一个工程。新建一个工程后,VB自动生成了一个窗体,其默认的名称是Form1,且显示的...
托盘程序是指这样一类程序:当程序运行后,会在系统的托盘区(也有说是状态区域)创建此程序的图标,使用者可以通过点击图标出现的菜单来控制程序的运行状态。托盘程序有很多优点,如不占屏幕,后台运行,便于控制等。所以现在越来越多的程序都做成了托盘程序。在VB.NET中,编写托盘程序是比较方便和简单的。这是因为VB.NET没有自身类库,...

经验教程

589

收藏

58
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部