将VB程序加入盘拖

来自:http://basicfan.yeah.net/ 作者:
1.这里我们调用的API函数是:“Shell_NotifyIcon”,在您的模块中添加如下的函数声明和常量声明:
'以下常量告诉系统在托盘中您的图标上发生了什么操作
'常量声明
Public Const WM_MOUSEISMOVING = &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" Alias "Shell_NotifyIconA" (ByVal dwMessage As enm_NIM_Shell, pnid As NOTIFYICONDATA) As Boolean
'自定义一个调用API Shell_NotifyIcon 要用到的类型“NOTIFYICONDATA”
Public Type NOTIFYICONDATA
cbSize 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 = &H0 '在“金碟”中加一图标
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编程)、名称(submnu1);
标题(退出)、名称(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
.uId = 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 Integer, 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.TwipsPerPixelX
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