Winapi 处理鼠标移动和鼠标单击托盘图标
我的VB6应用程序通常是隐藏的,并且有一个托盘图标。它当前按照以下代码处理用户定义的回调:Winapi 处理鼠标移动和鼠标单击托盘图标,winapi,vb6,system-tray,trayicon,Winapi,Vb6,System Tray,Trayicon,我的VB6应用程序通常是隐藏的,并且有一个托盘图标。它当前按照以下代码处理用户定义的回调: Public Const WM_USER = &H400 Public Const TRAY_CALLBACK = (WM_USER + 1001&) With GTStruct .uID = mId .hwnd = frm.hwnd .hIcon = frm.Icon.Handle .UFlags = NIF_ICON Or NIF_MESSAGE
Public Const WM_USER = &H400
Public Const TRAY_CALLBACK = (WM_USER + 1001&)
With GTStruct
.uID = mId
.hwnd = frm.hwnd
.hIcon = frm.Icon.Handle
.UFlags = NIF_ICON Or NIF_MESSAGE
.uCallbackMessage = TRAY_CALLBACK
.cbSize = Len(GTStruct)
End With
Shell_NotifyIcon NIM_ADD, GTStruct
WindowProc处理托盘回调和单击消息:
Const WM_NCDESTROY = &H82
Const WM_CLOSE = &H10
' If we're being destroyed, remove the tray icon
' and restore the original WindowProc.
If Msg = WM_NCDESTROY Or Msg = WM_CLOSE Then
RemoveFromTray
ElseIf Msg = TRAY_CALLBACK Then
' The user clicked on the tray icon.
' Look for click events.
If lParam = WM_RBUTTONUP Then
' On right click, show the menu.
SetForegroundWindow TheForm.hwnd
TheForm.PopupMenu TheMenu
If Not (TheForm Is Nothing) Then
PostMessage TheForm.hwnd, WM_NULL, ByVal 0&, ByVal 0&
End If
Exit Function
End If
End If
按原样,应用程序工作,右键单击图标打开菜单。除了此现有回调消息之外,我还想处理鼠标移动消息,因此我将回调更改为:
.uCallbackMessage = TRAY_CALLBACK Or WM_MOUSEMOVE
但是,这会忽略mousemove消息。如果我使用:
.uCallbackMessage = WM_MOUSEMOVE
mouse\u move消息起作用,Form\u MouseMove被正确调用,但随后菜单停止工作
问题
如何指定多个回调以处理鼠标移动和鼠标单击?每个图标只能有一条回调消息;在您的情况下,这是
托盘回调
。当您收到此消息时,lParam
值指示触发回调的鼠标消息
在示例代码中,您已经将
lParam
与WM\u RBUTTONUP
进行了比较。您只需针对WM_MOUSEMOVE
添加额外的检查,每个图标只能有一条回调消息;在您的情况下,这是托盘回调
。当您收到此消息时,lParam
值指示触发回调的鼠标消息
在示例代码中,您已经将
lParam
与WM\u RBUTTONUP
进行了比较。您只需针对WM_MOUSEMOVE
添加额外的检查,每个图标只能有一条回调消息;在您的情况下,这是托盘回调
。当您收到此消息时,lParam
值指示触发回调的鼠标消息
在示例代码中,您已经将
lParam
与WM\u RBUTTONUP
进行了比较。您只需针对WM_MOUSEMOVE
添加额外的检查,每个图标只能有一条回调消息;在您的情况下,这是托盘回调
。当您收到此消息时,lParam
值指示触发回调的鼠标消息
在示例代码中,您已经将lParam
与WM\u RBUTTONUP
进行了比较。您只需针对WM\u MOUSEMOVE
添加额外的检查