Можно ли различить одиночный и двойной щелчок на значке в системном трее?

Я создаю свой значок в системном трее, используя 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;
}

1

Решение

Я подозреваю, что вам придется стать умным об этом.

В вашем WM_LBUTTONDOWN обработчик кликов, установить таймер срок действия которого истекает после время двойного щелчка прошло. В вашем WM_LBUTTONDBLCLICK Обработчик проверяет, активен ли этот таймер, и если это так, отмените его.

Если таймер истекает, это означает, что пользователь нажал на ваш значок, но не щелкнул дважды; это означает, что пришло время показать контекстное меню.

3

Другие решения

Показать контекстное меню на WM_RBUTTONDOWN или же WM_CONTEXTMENU, Что касается левой кнопки одиночного и двойного щелчка, для правильного оформления требуется обработчик двойного щелчка в качестве продолжения одиночного щелчка. Например, в проводнике Windows одним щелчком мыши выбирается файл, а двойным щелчком открывается его. Обработчик одиночного щелчка всегда работает до обработчика двойного щелчка, и это должно выглядеть естественно. В вашем случае я бы показал меню по правому клику, а диалог по левому клику.

Решения, основанные на таймерах и задержках, создают ошибочный и ненадежный код.

1

По вопросам рекламы [email protected]