Как разместить контекстное меню значка уведомления (трея) в Windows XP? - PullRequest
1 голос
/ 08 апреля 2011

Я использую C ++ и Win32.

Я хочу, чтобы мое контекстное меню и диалог настроек отображались рядом со значком в трее. Я думаю, мне нужны координаты значка, чтобы сделать это.

Shell_NotifyIconGetRect не был доступен до Windows 7.

WM_CONTEXTMENU доступен начиная с Win2k, но предоставляет только координаты в wParam начиная с Vista (и при указании NOTIFYICON_VERSION_4).

Ответы [ 3 ]

2 голосов
/ 08 апреля 2011

Правильный способ решения этой проблемы - использовать координаты сообщения мыши или GetMessagePos для других сообщений.

1 голос
/ 08 апреля 2011

Получение координат клика с помощью GetCursorPos работает хорошо:

// Inside WndProc's switch(message)...
case WM_APP_NOTIFYCALLBACK:
    switch (LOWORD(lParam))
    {
    case WM_CONTEXTMENU: // XP and later
        {
            POINT pt = {};
            if( GetCursorPos(&pt) )
                ShowContextMenu(hWnd, pt, iStatus);
        }
        break;
    // ...
    }
    // ...
0 голосов
/ 08 апреля 2011

Для отображения меню все, что вам нужно, это координаты, передаваемые вам WM_CONTEXTMENU или WM_RBUTTONUP (Это, конечно, не обычные сообщения, а нечто, генерируемое в трее, и поэтому вам не нужно иметь дело с мышьюпротив клавиатуры)

Shell_NotifyIconGetRect используется, если вы хотите отобразить тост (настраиваемое окно) рядом с лотком.В <7 вы можете эмулировать его с помощью findwindow, ища класс TrayNotifyWnd с Shell_TrayWnd в качестве родителя </p>

...