'Download the full source+pictures+... at http://www.allapi.net/php/redirect/redirect.php?action=download&id=38 Private 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 TypePrivate Const NIM_ADD = &H0 Private Const NIM_MODIFY = &H1 Private Const NIM_DELETE = &H2 Private Const NIF_MESSAGE = &H1 Private Const NIF_ICON = &H2 Private Const NIF_TIP = &H4Private Const WM_LBUTTONDBLCLK = &H203 Private Const WM_LBUTTONDOWN = &H201 Private Const WM_RBUTTONUP = &H205Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean Dim TrayI As NOTIFYICONDATA Private Sub Form_Load() TrayI.cbSize = Len(TrayI) 'Set the window's handle (this will be used to hook the specified window) TrayI.hWnd = pichook.hWnd 'Application-defined identifier of the taskbar icon TrayI.uId = 1& 'Set the flags TrayI.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE 'Set the callback message TrayI.ucallbackMessage = WM_LBUTTONDOWN 'Set the picture (must be an icon!) TrayI.hIcon = imgIcon(2).Picture 'Set the tooltiptext TrayI.szTip = "Recent" & Chr$(0) 'Create the icon Shell_NotifyIcon NIM_ADD, TrayI Me.Hide End Sub Private Sub Form_Unload(Cancel As Integer) 'remove the icon TrayI.cbSize = Len(TrayI) TrayI.hWnd = pichook.hWnd TrayI.uId = 1& Shell_NotifyIcon NIM_DELETE, TrayI End End Sub Private Sub mnuPop_Click(Index As Integer) Select Case Index Case 0 MsgBox "KPD-Team 1998" + Chr$(13) + "URL: http://www.allapi.net/" + Chr$(13) + "E-Mail: [email protected]", vbInformation + vbOKOnly Case 2 Unload Me End Select End Sub Private Sub pichook_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Msg = X / Screen.TwipsPerPixelX If Msg = WM_LBUTTONDBLCLK Then 'Left button double click mnuPop_Click 0 ElseIf Msg = WM_RBUTTONUP Then 'Right button click Me.PopupMenu mnuPopUp End If End Sub Private Sub Timer1_Timer() Static Tek As Integer 'Animate the icon Me.Icon = imgIcon(Tek).Picture TrayI.hIcon = imgIcon(Tek).Picture Tek = Tek + 1 If Tek = 3 Then Tek = 0 Shell_NotifyIcon NIM_MODIFY, TrayI End Sub
模块中: Option Explicit '强制定义每个使用的变量 Public 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的函数声明 Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias _ "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long '处理消息将用到的结构、常量、API声明 Public Type POINTAPI x As Long y As Long End Type Public 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 '定义托盘图标是否在桌面上 Public lpPrevWndProc As Long Public gHW As Long Public 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 Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Const GW_OWNER = 4 Declare Function GetWindow Lib "user32" (ByVal hwnd As _ Long, ByVal wCmd As Long) As Long Declare Function ShowWindow Lib "user32" (ByVal hwnd _ As Long, ByVal nCmdShow As Long) As Long '以下过程为消息循环处理 Public 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.文件 '弹出菜单 Case WM_LBUTTONDBLCLK '鼠标左键双击 Form1.Show '显示窗口 Case Else End Select Else '调用缺省窗口指针 WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam) End If End FunctionPublic Sub hook(f As Form) '将程序勾入消息环中 '利用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窗体中: '代码窗口的内容为: Dim MyNot As NOTIFYICONDATA '定义一个托盘结构 Dim hh As Long'2、在窗口form1加入一个主菜单mainmenu,设置为不可见。在加入一些子菜单如"显示窗口"(名称为:show),"隐藏窗口"(名称为:hide),'退出程序"(名称为:exit) Private Sub del() '按下删除托盘图标按钮 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为真 Timer1.Enabled = True Timer1.Interval = 1000 hide_Click Command2.Enabled = False End Sub Private Sub Command4_Click() '退出窗口按钮被按下 If trayflag = True Then exit_Click '如果托盘图标仍在,模拟按下"删除托盘图标"按钮 Unhook '退出消息循环 Unload Me '卸载窗体 End Sub Private Sub exit_Click() If trayflag = True Then del '如果托盘图标仍在,模拟按下“删除托盘图标"按钮 Unhook '退出消息循环 Unload Me '卸载窗体 End Sub Private Sub Form_Load() Command2_Click gHW = Me.hwnd '取得本窗体指针 hook Me '调用钩子函数,将自制消息处理函数钩入Windows的消息循环 Dim rc As Long Dim OwnerhWnd As Long '从任务管理器列表中移除</p> OwnerhWnd = GetWindow(Me.hwnd, GW_OWNER) rc = ShowWindow(OwnerhWnd, SW_HIDE) End Sub Private Sub hide_Click() Form1.Hide '隐藏窗口 End Sub Private Sub show_Click() Form1.Show '显示窗口 End Sub "还有我希望这个程序每隔一个小时运行一次,能用什么方法实现?"我有一个笨法子 作一个不可见的"监控"程序当被监控程序结束后启动监控程序上的timer控件60*1000后进行 shell 被监控程序路径 被监控程序路径 可写在ini中,也可写在注册表中
Private 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 TypePrivate Const NIM_ADD = &H0
Private Const NIM_MODIFY = &H1
Private Const NIM_DELETE = &H2
Private Const NIF_MESSAGE = &H1
Private Const NIF_ICON = &H2
Private Const NIF_TIP = &H4Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_RBUTTONUP = &H205Private Declare Function Shell_NotifyIcon Lib "shell32" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, pnid As NOTIFYICONDATA) As Boolean
Dim TrayI As NOTIFYICONDATA
Private Sub Form_Load()
TrayI.cbSize = Len(TrayI)
'Set the window's handle (this will be used to hook the specified window)
TrayI.hWnd = pichook.hWnd
'Application-defined identifier of the taskbar icon
TrayI.uId = 1&
'Set the flags
TrayI.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
'Set the callback message
TrayI.ucallbackMessage = WM_LBUTTONDOWN
'Set the picture (must be an icon!)
TrayI.hIcon = imgIcon(2).Picture
'Set the tooltiptext
TrayI.szTip = "Recent" & Chr$(0)
'Create the icon
Shell_NotifyIcon NIM_ADD, TrayI Me.Hide
End Sub
Private Sub Form_Unload(Cancel As Integer)
'remove the icon
TrayI.cbSize = Len(TrayI)
TrayI.hWnd = pichook.hWnd
TrayI.uId = 1&
Shell_NotifyIcon NIM_DELETE, TrayI
End
End Sub
Private Sub mnuPop_Click(Index As Integer)
Select Case Index
Case 0
MsgBox "KPD-Team 1998" + Chr$(13) + "URL: http://www.allapi.net/" + Chr$(13) + "E-Mail: [email protected]", vbInformation + vbOKOnly
Case 2
Unload Me
End Select
End Sub
Private Sub pichook_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Msg = X / Screen.TwipsPerPixelX
If Msg = WM_LBUTTONDBLCLK Then
'Left button double click
mnuPop_Click 0
ElseIf Msg = WM_RBUTTONUP Then
'Right button click
Me.PopupMenu mnuPopUp
End If
End Sub
Private Sub Timer1_Timer()
Static Tek As Integer
'Animate the icon
Me.Icon = imgIcon(Tek).Picture
TrayI.hIcon = imgIcon(Tek).Picture
Tek = Tek + 1
If Tek = 3 Then Tek = 0
Shell_NotifyIcon NIM_MODIFY, TrayI
End Sub
用Timer来就算程序运行的时间.
作一个不可见的"监控"程序当被监控程序结束后启动监控程序上的timer控件60*1000后进行
shell 被监控程序路径
被监控程序路径 可写在ini中,也可写在注册表中
Option Explicit '强制定义每个使用的变量
Public 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的函数声明
Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias _
"Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
'处理消息将用到的结构、常量、API声明
Public Type POINTAPI
x As Long
y As Long
End Type
Public 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 '定义托盘图标是否在桌面上
Public lpPrevWndProc As Long
Public gHW As Long
Public 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
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GW_OWNER = 4
Declare Function GetWindow Lib "user32" (ByVal hwnd As _
Long, ByVal wCmd As Long) As Long
Declare Function ShowWindow Lib "user32" (ByVal hwnd _
As Long, ByVal nCmdShow As Long) As Long
'以下过程为消息循环处理
Public 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.文件 '弹出菜单
Case WM_LBUTTONDBLCLK '鼠标左键双击
Form1.Show '显示窗口
Case Else
End Select
Else '调用缺省窗口指针
WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
End If
End FunctionPublic Sub hook(f As Form) '将程序勾入消息环中
'利用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窗体中:
'代码窗口的内容为:
Dim MyNot As NOTIFYICONDATA '定义一个托盘结构
Dim hh As Long'2、在窗口form1加入一个主菜单mainmenu,设置为不可见。在加入一些子菜单如"显示窗口"(名称为:show),"隐藏窗口"(名称为:hide),'退出程序"(名称为:exit)
Private Sub del() '按下删除托盘图标按钮
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为真
Timer1.Enabled = True
Timer1.Interval = 1000
hide_Click
Command2.Enabled = False
End Sub
Private Sub Command4_Click() '退出窗口按钮被按下
If trayflag = True Then exit_Click '如果托盘图标仍在,模拟按下"删除托盘图标"按钮
Unhook '退出消息循环
Unload Me '卸载窗体
End Sub
Private Sub exit_Click()
If trayflag = True Then del '如果托盘图标仍在,模拟按下“删除托盘图标"按钮
Unhook '退出消息循环
Unload Me '卸载窗体
End Sub
Private Sub Form_Load()
Command2_Click
gHW = Me.hwnd '取得本窗体指针
hook Me '调用钩子函数,将自制消息处理函数钩入Windows的消息循环
Dim rc As Long
Dim OwnerhWnd As Long
'从任务管理器列表中移除</p>
OwnerhWnd = GetWindow(Me.hwnd, GW_OWNER)
rc = ShowWindow(OwnerhWnd, SW_HIDE)
End Sub
Private Sub hide_Click()
Form1.Hide '隐藏窗口
End Sub
Private Sub show_Click()
Form1.Show '显示窗口
End Sub
"还有我希望这个程序每隔一个小时运行一次,能用什么方法实现?"我有一个笨法子
作一个不可见的"监控"程序当被监控程序结束后启动监控程序上的timer控件60*1000后进行
shell 被监控程序路径
被监控程序路径 可写在ini中,也可写在注册表中
imgIcon和pichook这两个函数没有定义,
是不是还需要引用什么dll文件或添加是什么控件啊?
http://www.hongen.com/pc/program/apitutor/api0012/api01.htm
下载地址:http://www.torontoservice.com/lihonggen/message.zip
VB版主lihonggen0(李洪根)写的一个局域网消息发送器,全力推荐下载,OICQ界面,垂直菜单控件技术,局域网消息发送技术,网络资源访问技术,系统托盘技术,资源管理器界面的分隔条技术,API函数使用等,为初学者提供一个代码例子。