SysTray and TrackPopupMenu...
От: RomaWeb  
Дата: 20.10.05 12:33
Оценка:
Помогите!!!
Есть иконка в SysTray, есть PopUpMenu. При нажатии на иконке правой кнопкой мыши меню появляется и когда щелкаем в другом месте оно исчезаетю Все вроде ок вот код:
if(lParam == WM_RBUTTONDOWN)
{
EndMenu();
POINT pt;
::GetCursorPos(&pt);
::SetForegroundWindow(m_hWnd);
m_CmdBar.TrackPopupMenu(m_hMenu, 0, pt.x, pt.y);
}

Но когда щелкаем правой кнопкой на другой иконке в трее а затем правой кнопкой на моем значке меню появляется но убрать его, просто щелкнув в другом месте, не получается.
Я уже запарился все перепробовал!!
Re: SysTray and TrackPopupMenu...
От: RomaWeb  
Дата: 20.10.05 12:45
Оценка:
Люди очень надо помогите
Если конечно есть специалисты в области WINAPI, WTL
Re: SysTray and TrackPopupMenu...
От: Кодт Россия  
Дата: 20.10.05 12:50
Оценка:
Здравствуйте, RomaWeb, Вы писали:

RW>Но когда щелкаем правой кнопкой на другой иконке в трее а затем правой кнопкой на моем значке меню появляется но убрать его, просто щелкнув в другом месте, не получается.


Оказывается, это не у одного тебя проблемы. Многие программы так себя ведут
Перекуём баги на фичи!
Re[2]: SysTray and TrackPopupMenu...
От: RomaWeb  
Дата: 20.10.05 12:53
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Оказывается, это не у одного тебя проблемы. Многие программы так себя ведут


Так а выход есть из такой ситуации??
Или просто оставить как есть?
Re: SysTray and TrackPopupMenu...
От: algol Россия about:blank
Дата: 20.10.05 12:59
Оценка:
Здравствуйте, RomaWeb, Вы писали:

RW>Но когда щелкаем правой кнопкой на другой иконке в трее а затем правой кнопкой на моем значке меню появляется но убрать его, просто щелкнув в другом месте, не получается.


Использовал СTrayIconImpl отсюда. Все работает без проблем.
Re[2]: SysTray and TrackPopupMenu...
От: RomaWeb  
Дата: 20.10.05 13:14
Оценка:
Здравствуйте, algol, Вы писали:

A>Использовал СTrayIconImpl отсюда. Все работает без проблем.


Все сработало супер спасибо!! Будем думать почему.
Re[2]: SysTray and TrackPopupMenu...
От: Кодт Россия  
Дата: 20.10.05 13:15
Оценка:
Здравствуйте, 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 послать.
Перекуём баги на фичи!
Re: SysTray and TrackPopupMenu...
От: aik Австралия  
Дата: 20.10.05 13:21
Оценка:
Здравствуйте, 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);

PostMessage(hDlg, WM_NULL, 0, 0);
Re: SysTray and TrackPopupMenu...
От: RomaWeb  
Дата: 20.10.05 13:30
Оценка:
Все всем огромное спасибо я разобрался!
Ловить надо было так:
if(LOWORD(lParam) == WM_RBUTTONUP)
{
.........
}
А PostMessage можно не посылать
Re[2]: SysTray and TrackPopupMenu...
От: Кодт Россия  
Дата: 21.10.05 10:59
Оценка:
Здравствуйте, RomaWeb, Вы писали:

RW>Все всем огромное спасибо я разобрался!

RW>Ловить надо было так:
RW>if(LOWORD(lParam) == WM_RBUTTONUP)
RW> {
RW>.........
RW>}
RW>А PostMessage можно не посылать

Могут быть приколы: юзер нажал мышку где-то рядом (на соседней иконке ), а отпустил на твоей.
Кстати, многие программы ловят нажатие, а некоторые — отжатие. Только что мне удалось показать сразу две менюшки — от GMail Notifier (нажатие) и Miranda IM (отжатие). И что забавно, обе менюшки работали!!!

Первую удалось закрыть, нажав Esc, а вот от второй избавиться было сложнее
Перекуём баги на фичи!
Re[3]: SysTray and TrackPopupMenu...
От: Andrew S Россия http://alchemy-lab.com
Дата: 21.10.05 15:25
Оценка: +1
К>То есть, мало того, что окно нужно вытащить вперёд, ему требуется ещё и WM_NULL послать.

Блин, я офигиваю, дорогая редакция. Мало того, что эта проблема уже настолько всем проела проплешину, так еще никто не хочет воспользоваться поисками по гуглю\msdn\rsdn.

Q135788
и
TrackPopupMenu

Ну е-мое, товарищи, ну как же так, а?
http://www.rusyaz.ru/pr — стараемся писАть по-русски
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.