Я создаю свой значок в системном трее, используя 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;
}
Я подозреваю, что вам придется стать умным об этом.
В вашем WM_LBUTTONDOWN
обработчик кликов, установить таймер срок действия которого истекает после время двойного щелчка прошло. В вашем WM_LBUTTONDBLCLICK
Обработчик проверяет, активен ли этот таймер, и если это так, отмените его.
Если таймер истекает, это означает, что пользователь нажал на ваш значок, но не щелкнул дважды; это означает, что пришло время показать контекстное меню.
Показать контекстное меню на WM_RBUTTONDOWN
или же WM_CONTEXTMENU
, Что касается левой кнопки одиночного и двойного щелчка, для правильного оформления требуется обработчик двойного щелчка в качестве продолжения одиночного щелчка. Например, в проводнике Windows одним щелчком мыши выбирается файл, а двойным щелчком открывается его. Обработчик одиночного щелчка всегда работает до обработчика двойного щелчка, и это должно выглядеть естественно. В вашем случае я бы показал меню по правому клику, а диалог по левому клику.
Решения, основанные на таймерах и задержках, создают ошибочный и ненадежный код.