Nano Hash - криптовалюты, майнинг, программирование

Как разместить контекстное меню значка уведомления (на панели задач) в Windows XP?

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

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

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

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


  • Используйте позицию в сообщениях мыши, чтобы разместить свое меню 08.04.2011
  • Ладно, в этом есть смысл. Я мог бы сделать это и для диалога настроек. 08.04.2011
  • @Erik @Ian Что произойдет, если меню вызвать с клавиатуры? 08.04.2011
  • Как вызвать контекстное меню с клавиатуры? Значок недоступен для фокусировки. 08.04.2011
  • Не легко сфокусироваться. Если вы вызываете контекстное меню с клавиатуры, кажется, что Windows перемещает курсор в центр значка (по крайней мере, в Windows 7), поэтому GetMessagePos (), вероятно, сработает. 08.04.2011

Ответы:


1

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

08.04.2011
  • Это сработало. Часть описания моего вопроса неверна. В XP вы получаете сообщения обратного вызова WM_CONTEXTMENU. У них просто нет координат в wParam, как в Vista и 7. Однако GetMessagePos () в обработчике WM_CONTEXTMENU работает отлично. 08.04.2011
  • Собственно GetCursorPos работает. GetMessagePos на самом деле этого не делает. Если я вызываю диалоговое окно с помощью контекстного меню, а затем закрываю это диалоговое окно, GetMessagePos дает мне позицию, в которой я щелкнул, чтобы закрыть. GetCursorPos, кажется, ведет себя лучше. 08.04.2011

  • 2

    Получение координат щелчка с помощью 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;
        // ...
        }
        // ...
    
    08.04.2011

    3

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

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

    08.04.2011
  • Это не работает. Эти сообщения не содержат координат в LPARAM. 08.04.2011
  • Дэвид прав насчет этого. Это сообщения обратного вызова, а не обычные сообщения Windows. lParam содержит сообщение. 08.04.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..