VB Shell_NotifyIcon函数设计托盘程序问题

来源:百度知道 编辑:UC知道 时间:2024/04/27 20:33:25
我想在程序缩小到托盘后,然后单击任务栏中的托盘后弹出菜单,我是用窗口程序设计的,通过窗口程序截取WM_RBUTTONUP消息后,用PopupMenu ha这句完成,但实现不了,一运行程序就发生错误自动关闭了.用窗口程序怎样该呢?请高手帮忙解答!
下面是我的代码:
模块代码:
Option Explicit

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
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) 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 Shell_NotifyIcon Lib "shell

Private Sub Command1_Click()
Dim r As Long
p = GetWindowLong(Form1.hwnd, GWL_WNDPROC)
r = SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf wn)
id.cbSize = Len(id)
id.hwnd = Me.hwnd
id.uID = 9999
id.uFlags = NIF_ICON + NIF_TIP + NIF_MESSAGE
id.uCallbackMessage = 9000
id.hIcon = Me.Icon
id.szTip = "haha" + Chr(0)
Call Shell_NotifyIcon(NIM_ADD, id)
End Sub

主要在这段。
由于托盘图标点击以后我们要做事情(转移Windows的处理程序),因此我们要用SetWindowlong把自己过程传进去代替原有(什么都不干)的处理程序。
这其中Windows怎么知道你过程在哪里(怎么传东西给你)呢?你就要传指针(内存地址)。于是Addressof出现了,它是一个运算符 返回一个函数/过程的内存地址。

但是问题是……Addressof不能在窗体中用。因此你可以尝试把这一段写入模块中一个自己过程如:Sub NewTrayIcon(),然后窗体中Call NewTrayIcon即可。

X的问题:
X是鼠标横坐标 但是单位是Twip(默认15Twip=1Px)。后面你可以看到Screen.TwipsPerPixelX就是15.windows中单位一般都是像素,所以我们要转换。但是为什么用X来判断消息类别……这个也很奇异。这种写法MSDN肯定不推荐,不建议使用。只是投机取巧的办法。

WM_MOUSEMOVE消息的wparam的前一半包含x坐标值,后一半包含y坐标值,当VB接收到WM_MOUSEMOVE消息以后会分离lparam的xy坐标信息,按照form的scalemode经过单位转换后触发m