【问题标题】:Handling both mouse move and mouse click on a tray icon处理鼠标移动和鼠标单击托盘图标
【发布时间】:2014-07-08 21:00:59
【问题描述】:

我的 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
    .uCallbackMessage = TRAY_CALLBACK        
    .cbSize = Len(GTStruct)
End With
Shell_NotifyIcon NIM_ADD, GTStruct

WindowProc 处理 TRAY_CALLBACK 和点击消息:

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

实际上,应用程序可以正常工作,然后右键单击图标会弹出菜单。除了这个现有的回调消息之外,我还想处理 mouse_move 消息,所以我将回调更改为:

.uCallbackMessage = TRAY_CALLBACK Or WM_MOUSEMOVE 

但是,这会忽略 mousemove 消息。如果我使用:

.uCallbackMessage = WM_MOUSEMOVE 

mouse_move 消息有效并且 Form_MouseMove 被正确调用,但随后菜单停止工作。

问题

如何指定多个回调来处理鼠标移动和鼠标点击?

【问题讨论】:

    标签: winapi vb6 system-tray trayicon


    【解决方案1】:

    每个图标只能有一条回调消息;在你的情况下,这是TRAY_CALLBACK。当您收到此消息时,lParam 值指示哪个鼠标消息触发了您的回调。

    在您的示例代码中,您已经在比较 lParamWM_RBUTTONUP。您只需要针对WM_MOUSEMOVE 添加额外的检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多