设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1047|回复: 3
打印 上一主题 下一主题

[其它] 难题,托盘程序

[复制链接]
跳转到指定楼层
1#
发表于 2006-10-15 00:30:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大侠,我如何让附件的窗体在最小时,让它进入托盘状态。请帮忙完成它,然后上传给我,谢啦。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2006-10-15 01:16:00 | 只看该作者
怎样使access最小化后,进入系统托盘(任务栏)像QQ一样

程序(附后)用到了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,由这个窗口过程来接收和处理操作系统发来的消息(实际上存在一个消息队列),通常情况
3#
发表于 2006-10-15 01:17:00 | 只看该作者
<FONT size=2>将图标添加到托盘的函数,参见模块中的解释
'注意了这是从主程序到模块的入口,本例中并没有直接调用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
'窗体最大化时
Case vbMaximized
mnuTrayMaximize.Enabled = False
mnuTrayMinimize.Enabled = True
mnuTrayMove.Enabled = False
mnuTrayRestore.Enabled = True
mnuTraySize.Enabled = False
'一般状态下
Case vbNormal
mnuTrayMaximize.Enabled = True
mnuTrayMinimize.Enabled = True
mnuTrayMove.Enabled = True
mnuTrayRestore.Enabled = False
mnuTraySize.Enabled = True
End Select
If WindowState <> vbMinimized Then LastState = WindowState
End Sub
'保证在程序退出时删除托盘图标
Private Sub Form_Unload(Cancel As Integer)
RemoveFromTray
End Sub
'“文件”菜单的“退出”项被点击时
Private Sub mnuFileExit_Click()
Unload Me
End Sub
'托盘图标右键菜单上的“退出”项被点击时
Private Sub mnuTrayClose_Click()
Unload Me
End Sub
'托盘图标右键菜单上的“最大化”项被点击时
Private Sub mnuTrayMaximize_Click()
WindowState = vbMaximized
End Sub
'托盘图标右键菜单上的“最小化”项被点击时
Private Sub mnuTrayMinimize_Click()
WindowState = vbMinimized
End Sub

'托盘图标右键菜单上的“移动”项被点击时
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
'-----------------------------------------
'以下为模块中的代码:
'-----------------------------------------
Option Explicit

Public OldWindowProc As Long
Public TheForm As Form
Public TheMenu As Menu
'【VB声明】
'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

'【说明】
' 此函数发送消息到一个窗口过程

'【返回值】
' Long,依据发送的消息不同而变化

'【参数表】
' lpPrevWndFunc----- Long,原来的窗口过程地址

' HWnd-------------- Long,窗口句柄

' Msg -------------- Long,发送的消息

' wParam ----------- Long,消息类型,参考wParam参数表

' lParam ----------- Long,依据wParam参数的不同而不同

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

'【VB声明】
' Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

'【说明】
' 在窗口结构中为指定的窗口设置信息

'【返回值】
' Long,指定数据的前一个值

'【参数表】
' hwnd ----------- Long,欲为其取得信息的窗口的句柄

' nIndex --------- Long,请参考GetWindowLong函数的nIndex参数的说明

' dwNewLong ------ Long,由nIndex指定的窗口信息的新值
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal HWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

'【VB声明】
'Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long

'【说明】

'【参数表】
'参数dwMessage ---- 为消息设置值,它可以是以下
4#
 楼主| 发表于 2006-10-15 05:26:00 | 只看该作者
谢楼主啦,怪我才疏艺浅。是否可帮忙依我的附件做个范例给我。谢啦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-29 15:53 , Processed in 0.081017 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表