我可以区分系统托盘图标上的单击和双击吗?

时间:2014-05-28 18:22:43

标签: c++ winapi windows-shell system-tray trayicon

我使用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);

2 个答案:

答案 0 :(得分:3)

我怀疑你必须聪明一点。

WM_LBUTTONDOWN点击处理程序中,set a timer在系统double click time结束后过期。在WM_LBUTTONDBLCLICK处理程序中,检查该计时器是否处于活动状态,如果是,请取消它。

如果计时器到期,则意味着用户点击了您的图标但没有继续并双击它;这意味着现在是时候显示上下文菜单了。

答案 1 :(得分:1)

WM_RBUTTONDOWNWM_CONTEXTMENU上显示上下文菜单。关于左键单击和双击,正确的设计需要双击处理程序作为单击的继续。例如,在Windows资源管理器中,单击选择一个文件,然后双击打开它。单击处理程序在双击处理程序之前始终有效,这应该看起来很自然。在您的情况下,我会在右键单击时显示一个菜单,并在左键单击时显示对话框。

基于计时器和延迟的解决方案会产生错误和不可靠的代码。