我使用Shell_NotifyIcon
创建系统托盘图标,然后在用户双击图标时捕获其WM_LBUTTONDBLCLK
通知(我使用它显示一个对话框窗口。)我也陷阱{{1通知以显示上下文菜单。
现在我认为在单击左键后显示上下文菜单会很不错。但是我该怎么做?
如果我捕获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);
答案 0 :(得分:3)
我怀疑你必须聪明一点。
在WM_LBUTTONDOWN
点击处理程序中,set a timer在系统double click time结束后过期。在WM_LBUTTONDBLCLICK
处理程序中,检查该计时器是否处于活动状态,如果是,请取消它。
如果计时器到期,则意味着用户点击了您的图标但没有继续并双击它;这意味着现在是时候显示上下文菜单了。
答案 1 :(得分:1)
在WM_RBUTTONDOWN
或WM_CONTEXTMENU
上显示上下文菜单。关于左键单击和双击,正确的设计需要双击处理程序作为单击的继续。例如,在Windows资源管理器中,单击选择一个文件,然后双击打开它。单击处理程序在双击处理程序之前始终有效,这应该看起来很自然。在您的情况下,我会在右键单击时显示一个菜单,并在左键单击时显示对话框。
基于计时器和延迟的解决方案会产生错误和不可靠的代码。