CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VB >  基础类

VB中如何实现:程序启动时, 在任务栏右下角添加小图标?谢谢

楼主ruihuama(天天天蓝)2005-06-03 10:39:38 在 VB / 基础类 提问

This   is   a   tough   problem   for   me   right   now.   Really   really   need   all   you   guys   hands.   Thanks   for   your   concern   and   help   in   advance. 问题点数:100、回复次数:6Top

1 楼bee6803(欢笑人生)回复于 2005-06-03 11:05:51 得分 10

我有这样的一个例程代码你留下你的email,我发给你好了.Top

2 楼crycoming(瞎编)回复于 2005-06-03 11:10:04 得分 60

网上好多。。。。。。。。。。。。。  
  很多软件运行时会在系统托盘区(就是桌面右下角显示时间的区域)出现一个小图标,它作为程序运行的一个标志,我们可以通过使用小图标所弹出的菜单来控制应用程序的状态。本例就给出了一个功能比较完整的托盘程序,我们可以看到怎样用API函数Shell_NotifyIcon来添加、删除、更改托盘图标;而且例中还演示了为托盘图标添加右键菜单和浮动提示的方法。    
   
    程序(附后)用到了Shell_NotifyIcon、SendMessage、CallWindowProc、SetWindowLong等API函数,其中Shell_NotifyIcon是主要的函数,它用来添加、删除、更改系统托盘区(taskbar   status   area)的图标,所以我们先来看看这个函数的声明和参数:  
   
    使用API函数之前必须先在程序中声明如下:  
   
  Declare   Function   Shell_NotifyIcon   Lib   "shell32.dll"   Alias   "Shell_NotifyIconA"   (ByVal   dwMessage   As   Long,   lpData   As   NOTIFYICONDATA)   As   Long    
   
        
    其中各参数的意义如下表:    
   
  参数:   意义    
  dwMessage   为消息设置值,它可以是以下的几个常数值:0、1、2    
  NIM_ADD   =   0    加入图标到系统状态栏中    
  NIM_MODIFY   =   1     修改系统状态栏中的图标    
  NIM_DELETE   =   2     删除系统状态栏中的图标    
   
    LpData   用以传入NOTIFYICONDATA数据结构变量,其结构如下所示:  
   
  Type   NOTIFYICONDATA  
   
    cbSize   As   Long          需填入NOTIFYICONDATA数据结构的长度  
    HWnd   As   Long           设置成窗口的句柄    
    Uid   As   Long         为图标所设置的ID值  
    UFlags   As   Long          设置uCallbackMessage,hIcon,szTip是否有效  
    UCallbackMessage   As   Long     消息编号  
    HIcon   As   Long             显示在状态栏上的图标  
    SzTip   As   String   *   64       提示信息  
  End   Type    
   
    返回值   Long,非零表示成功,零表示失败    
   
    在使用这个API函数之前我们应该先定义结构类型NOTIFYICONDATA:  
   
  Public   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      
   
    然后定义一个NOTIFYICONDATA的变量TheData来记录设置托盘图标的数据  
   
  Private   TheData   As   NOTIFYICONDATA    
    这时我们就可以使用这个函数来设置系统托盘图标了,具体方法如下:  
   
     1、添加图标  
   
  With   TheData    
      .Uid   =   0  
      .HWnd   =   frm.HWnd       注释:frm.HWnd是程序主窗体的句柄  
      .cbSize   =   Len(TheData)  
      .HIcon   =   frm.Icon.Handle  注释:frm.Icon.Handle指向主窗体的图标  
      .UFlags   =   NIF_ICON  
      .UCallbackMessage   =   TRAY_CALLBACK    
         注释:作用是允许返回消息,在下一节中会有详细解释。  
      .UFlags   =   .UFlags   Or   NIF_MESSAGE  
      .cbSize   =   Len(TheData)  
     End   With  
     Shell_NotifyIcon   NIM_ADD,   TheData      
    注释:根据前面定义NIM_ADD,设置为“添加模式”,然后添加    
       
   
     2、删去图标  
   
  With   TheData  
      .UFlags   =   0  
  End   With    
  Shell_NotifyIcon   NIM_DELETE,   TheData    
  注释:根据前面定义NIM_DELETE,设置为“删除模式”    
         
     3、更改图标  
   
  With   TheData    
    .HIcon   =   pic.Handle        
    注释:pic是图片狂PictureBox,存放图标文件  
    .UFlags   =   NIF_ICON  
  End   With    
  Shell_NotifyIcon   NIM_MODIFY,   TheData   
  注释:根据前面定义NIM_MODIFY,设置为“更改模式”    
         
     4、为图标添加浮动提示信息  
   
  With   TheData    
      .SzTip   =   tip   &   vbNullChar   
          注释:tip是字符串string,存储提示信息  
      .UFlags   =   NIF_TIP       
      注释:指明要对浮动提示进行设置    
  End   With    
  Shell_NotifyIcon   NIM_MODIFY,   TheData   
  注释:根据前面定义NIM_MODIFY,设置为“修改模式”      
       
   
    通过以上几段代码我们就能根据自己需要添加、删除、更改系统托盘图标,并能添加系统图标上的浮动提示信息。但这时的托盘图标是孤立的,我们并不能利用它来控制应用程序的行为,怎么办呢?别急,请往下看……    
    如果你下载(源程序下载)并运行这个例程序,你会发现如果我们在托盘图标上点击鼠标右键,则会弹出一个右键菜单。如果点击相应的菜单项,程序主窗体会随之变化,这样就可以控制程序的行为。而如果当主窗体处于最小化状态时,我们在托盘图标上点击左键,窗体会恢复到原来的大小。其实实现上述的功能都要依赖于WINDOWS操作系统的消息机制,要完全弄懂这个机制挺不容易的,但是我们可以按下述文字来理解它。  
   
    把WINDOWS操作系统看作人的大脑,它接收、处理、并发送各种各样的信息给我们的各个器官(当然是比喻各个应用程序了),也就是说它是消息的中枢。而每个应用程序(甚至每一个按钮、标签、窗体等等统称为窗口)在运行时都会被分配一个窗口过程WINDOWPROC,由这个窗口过程来接收和处理操作系统发来的消息(实际上存在一个消息队列),通常情况下这个窗口过程是由操作系统指定的,它会自动的响应并处理一些WINDOWS消息(如窗体移动、最大化、最小化、错误信息等)。好,到这我们先停一下,提出一个疑问,这些消息能否由我们自己写程序来处理呢?答案是肯定的,不过还得借助API函数的威力了,怎么用?我们还是先看看这些API函数的定义和参数吧。    
   
    程序中用到了SendMessage、CallWindowProc、SetWindowLong等API函数,其中SendMessage函数的作用是将一条消息发给某个窗口;CallWindowProc函数用来发送消息到一个窗口过程;而使用SetWindowLong函数来为窗口结构中为指定的窗口设置属性。使用API函数之前必须先在程序中声明如下:  
   
   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    
   
   Private   Declare   Function   SendMessage   Lib   "user32"   Alias   "SendMessageA"   (ByVal   HWnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   lParam   As   Any)   As   Long      
     
   
  Top

3 楼crycoming(瞎编)回复于 2005-06-03 11:10:30 得分 0

其中各参数的意义如下表:    
   
    CallWindowProc函数  
   
  参数   意义    
  lpPrevWndFunc     Long,原来的窗口过程地址    
  HWnd   Long,窗口句柄    
  Msg   Long,发送的消息    
  wParam   Long,消息类型,参考wParam参数表      
  lParam   Long,依据wParam参数的不同而不同      
   
    返回值   Long,依据发送的消息不同而变化    
   
    SetWindowLong函数   :    
   
  参数   意义    
  hwnd     Long,欲为其取得信息的窗口的句柄    
  nIndex   Long,请参考GetWindowLong函数的nIndex参数的说明    
  dwNewLong   Long,由nIndex指定的窗口信息的新值      
   
    返回值   Long,指定数据的前一个值    
   
    SendMessage函数   :    
   
  参数   意义    
  hwnd     Long,要接收消息的那个窗口的句柄    
  wMsg   Long,消息的标识符    
  wParam   Long,具体取决于消息    
  lParam   Any,具体取决于消息      
   
    返回值   Long,由具体的消息决定    
    我们要自己写程序来处理消息,必须先更改窗口的属性,从原来由默认的窗口过程来处理消息变成由我们自己写的消息处理过程来处理消息。方法是使用SetWindowLong函数来取得默认窗口过程的地址,然后转向为我们自己写的窗口过程的地址,具体的实现方法如下代码:  
   
  注释:GWL_WNDPROC获得该窗口的窗口过程的地址,AddressOf是取址函数,NewWindowProc是我们写的过程  
  OldWindowProc   =   SetWindowLong(frm.HWnd,   GWL_WNDPROC,   AddressOf    
                 NewWindowProc)    
       
    然后在NewWindowProc函数中写入如下代码,需要注意的是下面代码中红色的TRAY_CALLBACK是由托盘区图标传来的消息,要让托盘图标传回消息,必须在添加托盘图标时指定:  
   
     Public   Function   NewWindowProc(ByVal   HWnd   As   Long,   ByVal   Msg   As   Long,   ByVal   wParam   As   Long,   ByVal   lParam   As   Long)   As   Long    
     注释:如果用户点击了托盘中的图标,则进行判断是点击了左键还是右键  
     If   Msg   =   TRAY_CALLBACK   Then    
       注释:如果点击了左键    
       If   lParam   =   WM_LBUTTONUP   Then  
         注释:而这时窗体的状态是最小化时    
         If   TheForm.WindowState   =   vbMinimized   Then   _    
          注释:恢复到最小化前的窗体状态    
            TheForm.WindowState   =   TheForm.LastState    
            TheForm.SetFocus  
            Exit   Function  
         End   If    
       End   If    
       注释:如果点击了右键    
       If   lParam   =   WM_RBUTTONUP   Then    
         注释:则弹出右键菜单    
         TheForm.PopupMenu   TheMenu    
         Exit   Function    
       End   If    
     End   If    
     注释:如果是其他类型的消息则传递给原有默认的窗口函数  
     NewWindowProc   =   CallWindowProc(OldWindowProc,   HWnd,   Msg,   wParam,   lParam)    
     End   Function      
   
    这样我们就取得并处理了来自托盘图标的消息,现在的问题是在鼠标右键菜单弹出后,怎么控制程序主窗体的状态,这时我们需要用到SendMessage函数来向主窗体发送最大化、最小化、关闭、移动等消息,具体的代码实现如下,其中HWnd是主窗体的句柄,WM_SYSCOMMAND表示发送的是系统控制类的消息,SC_MOVE、SC_SIZE、SC_RESTORE便是要发送的消息了:  
   
     注释:托盘图标右键菜单上的“移动”项被点击时  
     Private   Sub   mnuTrayMove_Click()    
       SendMessage   HWnd,   WM_SYSCOMMAND,   SC_MOVE,   0&    
     End   Sub    
     注释:托盘图标右键菜单上的“恢复”项被点击时    
     Private   Sub   mnuTrayRestore_Click()    
       SendMessage   HWnd,   WM_SYSCOMMAND,   SC_RESTORE,   0&    
     End   Sub    
     注释:托盘图标右键菜单上的“退出”项被点击时    
     Private   Sub   mnuTraySize_Click()    
       SendMessage   HWnd,   WM_SYSCOMMAND,   SC_SIZE,   0&    
     End   Sub      
   
    最后要提醒你,在程序退出时一定要把窗口过程的地址恢复为默认值,同时把托盘图标移去哦。  
    为了学习方便,以下提供了源代码:  
   
  注释:---------------------------------------------  
  注释:   使用系统托盘程序演示  
  注释:---------------------------------------------  
  注释:程序说明:  
  注释:   这是一个比较完整的使用系统托盘的程序实例,包括  
  注释:了:添加托盘图标,删除托盘图标,动态改变托盘图标,  
  注释:为托盘图标添加浮动提示信息,实现托盘图标的鼠标右键  
  注释:菜单等内容。  
  注释:-------名称-------------------作用------------  
  注释:   Form1   主窗体  
  注释:   mnuFile,mnuFileExit   文件菜单,菜单项  
  注释:   mnuTray,mnuTrayClose...   托盘区右键菜单,菜单项  
  注释:---------------------------------------------  
   
  Option   Explicit  
   
  注释:LastState变量的作用是标示主窗体原有状态  
  Public   LastState   As   Integer  
   
  注释:【VB声明】  
  注释:   Private   Declare   Function   SendMessage   Lib   "user32"   Alias   "SendMessageA"   (ByVal   hwnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   lParam   As   Any)   As   Long  
   
  注释:【说明】  
  注释:   调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回。SendMessageBynum,  
  注释:   SendMessageByString是该函数的“类型安全”声明形式  
   
  注释:【返回值】  
  注释:   Long,由具体的消息决定  
   
  注释:【参数表】  
  注释:   hwnd   -----------   Long,要接收消息的那个窗口的句柄  
   
  注释:   wMsg   -----------   Long,消息的标识符  
   
  注释:   wParam   ---------   Long,具体取决于消息  
   
  注释:   lParam   ---------   Any,具体取决于消息  
  Private   Declare   Function   SendMessage   Lib   "user32"   Alias   "SendMessageA"   (ByVal   HWnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   lParam   As   Any)   As   Long  
   
  注释:表示发送的是系统命令  
  Private   Const   WM_SYSCOMMAND   =   &H112  
  Private   Const   SC_MOVE   =   &HF010&  
  Private   Const   SC_RESTORE   =   &HF120&  
  Private   Const   SC_SIZE   =   &HF000&  
   
  注释:当主窗体加载时  
  Private   Sub   Form_Load()  
   
  注释:窗体的WindowState属性,返回或设置一个值,该值用来指定在运行时窗体窗口的可视状态  
  注释:vbNormal   0   (缺省值)正常   。  
  注释:VbMinimized   1   最小化(最小化为一个图标)  
  注释:VbMaximized   2   最大化(扩大到最大尺寸)  
  If   WindowState   =   vbMinimized   Then  
  LastState   =   vbNormal  
  Else  
  LastState   =   WindowState  
  End   If  
   
  注释:将图标添加到托盘的函数,参见模块中的解释  
  注释:注意了这是从主程序到模块的入口,本例中并没有直接调用Shell_NotifyIcon函数  
  AddToTray   Me,   mnuTray  
   
  SetTrayTip   "托盘图标演示,点击右键弹出菜单"  
  End   Sub  
   
  注释:在主窗体Form1大小改变时,相应改变右键菜单mnuTray的菜单项的可用属性Enabled  
  Private   Sub   Form_Resize()  
  Select   Case   WindowState  
   
  注释:如果窗体最小化了,把菜单项“最大化”“恢复”设为可用,  
  注释:而把“最小化”“移动”“大小”三项设为不可用.  
  注释:如果这时在托盘图标上点击鼠标右键,会发现不可用项变为灰色  
  Case   vbMinimized  
  mnuTrayMaximize.Enabled   =   True  
  mnuTrayMinimize.Enabled   =   False  
  mnuTrayMove.Enabled   =   False  
  mnuTrayRestore.Enabled   =   True  
  mnuTraySize.Enabled   =   False  
   
  Top

4 楼ljhdi( )回复于 2005-06-03 11:12:36 得分 0

楼上强Top

5 楼xinghesnake(星河)回复于 2005-06-03 11:15:52 得分 30

使用API函数之前必须先在程序中声明如下:  
   
  Declare   Function   Shell_NotifyIcon   Lib   "shell32.dll"   Alias   "Shell_NotifyIconA"   (ByVal   dwMessage   As   Long,   lpData   As   NOTIFYICONDATA)   As   Long    
   
        
    其中各参数的意义如下表:    
   
  参数:   意义    
  dwMessage   为消息设置值,它可以是以下的几个常数值:0、1、2    
  NIM_ADD   =   0    加入图标到系统状态栏中    
  NIM_MODIFY   =   1     修改系统状态栏中的图标    
  NIM_DELETE   =   2     删除系统状态栏中的图标    
   
    LpData   用以传入NOTIFYICONDATA数据结构变量,其结构如下所示:  
   
  Type   NOTIFYICONDATA  
   
    cbSize   As   Long          需填入NOTIFYICONDATA数据结构的长度  
    HWnd   As   Long           设置成窗口的句柄    
    Uid   As   Long         为图标所设置的ID值  
    UFlags   As   Long          设置uCallbackMessage,hIcon,szTip是否有效  
    UCallbackMessage   As   Long     消息编号  
    HIcon   As   Long             显示在状态栏上的图标  
    SzTip   As   String   *   64       提示信息  
  End   Type    
   
    返回值   Long,非零表示成功,零表示失败    
   
    在使用这个API函数之前我们应该先定义结构类型NOTIFYICONDATA:  
   
  Public   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      
   
    然后定义一个NOTIFYICONDATA的变量TheData来记录设置托盘图标的数据  
   
  Private   TheData   As   NOTIFYICONDATA    
    这时我们就可以使用这个函数来设置系统托盘图标了,具体方法如下:  
   
     1、添加图标  
   
  With   TheData    
      .Uid   =   0  
      .HWnd   =   frm.HWnd       注释:frm.HWnd是程序主窗体的句柄  
      .cbSize   =   Len(TheData)  
      .HIcon   =   frm.Icon.Handle  注释:frm.Icon.Handle指向主窗体的图标  
      .UFlags   =   NIF_ICON  
      .UCallbackMessage   =   TRAY_CALLBACK    
         注释:作用是允许返回消息,在下一节中会有详细解释。  
      .UFlags   =   .UFlags   Or   NIF_MESSAGE  
      .cbSize   =   Len(TheData)  
     End   With  
     Shell_NotifyIcon   NIM_ADD,   TheData      
    注释:根据前面定义NIM_ADD,设置为“添加模式”,然后添加    
       
   
     2、删去图标  
   
  With   TheData  
      .UFlags   =   0  
  End   With    
  Shell_NotifyIcon   NIM_DELETE,   TheData    
  注释:根据前面定义NIM_DELETE,设置为“删除模式”    
         
     3、更改图标  
   
  With   TheData    
    .HIcon   =   pic.Handle        
    注释:pic是图片狂PictureBox,存放图标文件  
    .UFlags   =   NIF_ICON  
  End   With    
  Shell_NotifyIcon   NIM_MODIFY,   TheData   
  注释:根据前面定义NIM_MODIFY,设置为“更改模式”    
         
     4、为图标添加浮动提示信息  
   
  With   TheData    
      .SzTip   =   tip   &   vbNullChar   
          注释:tip是字符串string,存储提示信息  
      .UFlags   =   NIF_TIP       
      注释:指明要对浮动提示进行设置    
  End   With    
  Shell_NotifyIcon   NIM_MODIFY,   TheData   
  注释:根据前面定义NIM_MODIFY,设置为“修改模式”      
       
   
    通过以上几段代码我们就能根据自己需要添加、删除、更改系统托盘图标,并能添加系统图标上的浮动提示信息。但这时的托盘图标是孤立的,我们并不能利用它来控制应用程序的行为,怎么办呢?别急,请往下看……    
    如果你下载(源程序下载)并运行这个例程序,你会发现如果我们在托盘图标上点击鼠标右键,则会弹出一个右键菜单。如果点击相应的菜单项,程序主窗体会随之变化,这样就可以控制程序的行为。而如果当主窗体处于最小化状态时,我们在托盘图标上点击左键,窗体会恢复到原来的大小。其实实现上述的功能都要依赖于WINDOWS操作系统的消息机制,要完全弄懂这个机制挺不容易的,但是我们可以按下述文字来理解它。  
   
    把WINDOWS操作系统看作人的大脑,它接收、处理、并发送各种各样的信息给我们的各个器官(当然是比喻各个应用程序了),也就是说它是消息的中枢。而每个应用程序(甚至每一个按钮、标签、窗体等等统称为窗口)在运行时都会被分配一个窗口过程WINDOWPROC,由这个窗口过程来接收和处理操作系统发来的消息(实际上存在一个消息队列),通常情况下这个窗口过程是由操作系统指定的,它会自动的响应并处理一些WINDOWS消息(如窗体移动、最大化、最小化、错误信息等)。好,到这我们先停一下,提出一个疑问,这些消息能否由我们自己写程序来处理呢?答案是肯定的,不过还得借助API函数的威力了,怎么用?我们还是先看看这些API函数的定义和参数吧。    
   
    程序中用到了SendMessage、CallWindowProc、SetWindowLong等API函数,其中SendMessage函数的作用是将一条消息发给某个窗口;CallWindowProc函数用来发送消息到一个窗口过程;而使用SetWindowLong函数来为窗口结构中为指定的窗口设置属性。使用API函数之前必须先在程序中声明如下:  
   
   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    
   
   Private   Declare   Function   SendMessage   Lib   "user32"   Alias   "SendMessageA"   (ByVal   HWnd   As   Long,   ByVal   wMsg   As   Long,   ByVal   wParam   As   Long,   lParam   As   Any)   As   Long      
     
   
  Top

6 楼ruihuama(天天天蓝)回复于 2005-06-03 11:40:55 得分 0

Got   the   point   from   you   guys.   Thanks   and   regards.Top

相关问题

  • VB中如何实现:程序启动时, 在任务栏右下角添加小图标?谢谢。
  • 在任务栏右下角如何隐藏qq图标????
  • 任务栏图标
  • 如何把程序缩成任务栏右下角的小图标?
  • 怎么让程序缩成windows右下角的任务栏上的图标?
  • 如何得到任务栏中右下角小图标的位置
  • '怎样把QQ在任务栏右下角的图标给换掉,或者控制隐藏/显示。
  • !请教大虾,如何利用delphi制作任务栏右下角的最小化图标(类似于oicq)
  • 怎样实现在程序运行的时候使任务栏的右下角出现一个小图标?
  • 求如何获取右下角任务栏中的图标句柄并操作之

关键词

  • 函数
  • 消息
  • 应用程序
  • api
  • 注释
  • 图标
  • 托盘
  • nim
  • 窗体
  • thedata

得分解答快速导航

  • 帖主:ruihuama
  • bee6803
  • crycoming
  • xinghesnake

相关链接

  • Visual Basic类图书
  • Visual Basic类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo