我可以在系统托盘图标单和双击区分?(Can I differentiate between sing

2019-10-20 04:29发布

我使用创建我的系统托盘图标Shell_NotifyIcon然后陷阱及其WM_LBUTTONDBLCLK为当用户双击该图标的通知(我用它显示一个对话框窗口。)我也陷阱WM_RBUTTONDOWN通知显示上下文菜单。

现在,我认为这将是很好的一个单一的左键点击后,显示上下文菜单。 但我怎么做呢?

如果我的陷阱WM_LBUTTONDOWN和展示我的上下文菜单,它工作正常。 但后来,当有人双击该图标,它首先表明我的上下文菜单,然后显示的对话框窗口。 所以,我不知道如何克服呢?

编辑:这是我的代码:

NOTIFYICONDATA nid;
memset(&nid, 0, sizeof(nid));
nid.cbSize = sizeof(nid);
nid.hWnd = this->GetSafeHwnd();
nid.uID = TRAY_ICON_ID1;
nid.uFlags = NIF_ICON;
nid.uCallbackMessage = TRAY_NOTIFICATION_ID1;
nid.hIcon = ghIcon;

Shell_NotifyIcon(NIM_ADD, &nid);

接着:

ON_MESSAGE(TRAY_NOTIFICATION_ID1, OnTrayIconNotifications)

LRESULT OnTrayIconNotifications(WPARAM wParam, LPARAM lParam)
{
    UINT uID = (UINT)wParam;
    UINT uMouseMsg = (UINT)lParam;

    if(uID == TRAY_ICON_ID1)
    {
        switch(uMouseMsg)
        {
        case WM_RBUTTONDOWN:
            {
                //Show context menu
                //...
                int nChosenCmd = TrackPopupMenu(hMenu, 
                    TPM_RIGHTALIGN | TPM_TOPALIGN |
                    TPM_LEFTBUTTON | TPM_VERPOSANIMATION | 
                    TPM_HORNEGANIMATION | TPM_RETURNCMD,
                    x, y, 0, 
                    this->GetSafeHwnd(), NULL);
            }
            break;

        case WM_LBUTTONDBLCLK:
            {
                //Show dialog window
                CDialogBasedClass dlg(this);
                dlg.DoModal();
            }
            break;
        }
    }

    return 0;
}

Answer 1:

我怀疑你将获得聪明一点。

在您的WM_LBUTTONDOWN单击处理程序, 设置一个计时器系统的后到期双击时间已过。 在您的WM_LBUTTONDBLCLICK处理程序检查,如果该定时器被激活,如果是,取消它。

如果计时器到期,这意味着用户点击你的图标,但没有进行下去,并双击它; 这意味着它的时间显示上下文菜单。



Answer 2:

显示在上下文菜单WM_RBUTTONDOWNWM_CONTEXTMENU 。 关于左键单并双击,正确的设计需要双击处理程序作为单一的点击的延续。 例如,在Windows资源管理器单一的点击选择一个文件,然后双击打开它。 只需点击一下,处理器总是先双击处理工作,这应该是自然的。 在你的情况我会显示在左侧点击右键菜单,对话框。

基于定时器和延误的解决方案创造越野车和不可靠的代码。



文章来源: Can I differentiate between single and double clicks on the system tray icon?