К>То есть, мало того, что окно нужно вытащить вперёд, ему требуется ещё и WM_NULL послать.
Блин, я офигиваю, дорогая редакция. Мало того, что эта проблема уже настолько всем проела проплешину, так еще никто не хочет воспользоваться поисками по гуглю\msdn\rsdn.
Помогите!!!
Есть иконка в SysTray, есть PopUpMenu. При нажатии на иконке правой кнопкой мыши меню появляется и когда щелкаем в другом месте оно исчезаетю Все вроде ок вот код:
if(lParam == WM_RBUTTONDOWN)
{
EndMenu();
POINT pt;
::GetCursorPos(&pt);
::SetForegroundWindow(m_hWnd);
m_CmdBar.TrackPopupMenu(m_hMenu, 0, pt.x, pt.y);
}
Но когда щелкаем правой кнопкой на другой иконке в трее а затем правой кнопкой на моем значке меню появляется но убрать его, просто щелкнув в другом месте, не получается.
Я уже запарился все перепробовал!!
Здравствуйте, RomaWeb, Вы писали:
RW>Но когда щелкаем правой кнопкой на другой иконке в трее а затем правой кнопкой на моем значке меню появляется но убрать его, просто щелкнув в другом месте, не получается.
Оказывается, это не у одного тебя проблемы. Многие программы так себя ведут
Здравствуйте, RomaWeb, Вы писали:
RW>Но когда щелкаем правой кнопкой на другой иконке в трее а затем правой кнопкой на моем значке меню появляется но убрать его, просто щелкнув в другом месте, не получается.
Использовал СTrayIconImpl отсюда. Все работает без проблем.
Здравствуйте, algol, Вы писали:
A>Здравствуйте, RomaWeb, Вы писали:
RW>>Но когда щелкаем правой кнопкой на другой иконке в трее а затем правой кнопкой на моем значке меню появляется но убрать его, просто щелкнув в другом месте, не получается.
A>Использовал СTrayIconImpl отсюда. Все работает без проблем.
Там есть интересный код
// Make app the foreground
SetForegroundWindow(pT->m_hWnd);
// Track
oPopup.TrackPopupMenu(TPM_LEFTALIGN, pos.x, pos.y, pT->m_hWnd);
// BUGFIX: See "PRB: Menus for Notification Icons Don't Work Correctly"pT->PostMessage(WM_NULL);
То есть, мало того, что окно нужно вытащить вперёд, ему требуется ещё и WM_NULL послать.
Здравствуйте, RomaWeb, Вы писали:
RW>Помогите!!! RW>Есть иконка в SysTray, есть PopUpMenu. При нажатии на иконке правой кнопкой мыши меню появляется и когда щелкаем в другом месте оно исчезаетю Все вроде ок вот код: RW>if(lParam == WM_RBUTTONDOWN) RW> { RW> EndMenu(); RW> POINT pt; RW> ::GetCursorPos(&pt); RW> ::SetForegroundWindow(m_hWnd); RW> m_CmdBar.TrackPopupMenu(m_hMenu, 0, pt.x, pt.y); RW> }
RW>Но когда щелкаем правой кнопкой на другой иконке в трее а затем правой кнопкой на моем значке меню появляется но убрать его, просто щелкнув в другом месте, не получается. RW>Я уже запарился все перепробовал!!
Проблема такая старая, что о ней и MSDN теперь говорит прямо в статье про TrackPopupMenu:
To display a context menu for a notification icon, the current window must be the foreground window before the application calls TrackPopupMenu or TrackPopupMenuEx. Otherwise, the menu will not disappear when the user clicks outside of the menu or the window that created the menu (if it is visible). However, when the current window is the foreground window, the second time this menu is displayed, it displays and then immediately disappears. To correct this, you must force a task switch to the application that called TrackPopupMenu at some time in the near future. This is done by posting a benign message to the window or thread, as shown in the following code sample:
SetForegroundWindow(hDlg);
// Display the menu
TrackPopupMenu( hSubMenu,
TPM_RIGHTBUTTON,
pt.x,
pt.y,
0,
hDlg,
NULL);
Здравствуйте, RomaWeb, Вы писали:
RW>Все всем огромное спасибо я разобрался! RW>Ловить надо было так: RW>if(LOWORD(lParam) == WM_RBUTTONUP) RW> { RW>......... RW>} RW>А PostMessage можно не посылать
Могут быть приколы: юзер нажал мышку где-то рядом (на соседней иконке ), а отпустил на твоей.
Кстати, многие программы ловят нажатие, а некоторые — отжатие. Только что мне удалось показать сразу две менюшки — от GMail Notifier (нажатие) и Miranda IM (отжатие). И что забавно, обе менюшки работали!!!
Первую удалось закрыть, нажав Esc, а вот от второй избавиться было сложнее