C++ программа только для системного трея

После проверки документации Microsoft по значкам на панели задач (которую я смог найти):

Функция Shell_NotifyIconA

Структура NOTIFYICONDATAA

Я заметил, что дескриптор окна (HWND) ТРЕБУЕТСЯ. Это очень плохо для того, что я пытаюсь сделать, так как я хочу создать программу, которая реагирует только на системный трей: она не «сворачивает» окно в трей, она просто использует уведомления (щелчок/ щелчок правой кнопкой мыши по значку) для взаимодействия.

Как мне это сделать?

Вы можете создать окно и никогда его не показывать.

tkausl 23.01.2019 18:23

Боже мой, это серьезно, как это должно работать? Я не могу передать nullptr или что-то в этом роде?

ZeroZ30o 23.01.2019 18:25

Документы на самом деле объясняют, зачем вам нужно окно: A handle to the window that receives notifications associated with an icon in the notification area. Только окна могут получать события, так что да, вам определенно нужно как минимум создать скрытое окно.

tkausl 23.01.2019 18:30

@ ZeroZ30o Дело в том, что окно, которое вы проходите, является целью сообщений. В Win32 не редкость использовать окна только для передачи сообщений - есть даже концепция окон только для сообщений (без фактической связанной поверхности рисования или чего-то еще).

Matteo Italia 23.01.2019 18:38

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

David Heffernan 23.01.2019 18:43

Вы можете использовать Окно только для сообщений: "Окно только для сообщений позволяет отправлять и получать сообщения. Он невидим, не имеет z-порядка, не может быть пронумерован и не получает широковещательные сообщения. Окно просто отправляет сообщения."

Remy Lebeau 23.01.2019 18:55

@RemyLebeau К сожалению, окно только для сообщений не получает WM_QUERYENDSESSION и другие широковещательные сообщения. Поэтому, если вы хотите корректно завершить работу, а не прерываться, лучше использовать обычное скрытое окно.

zett42 23.01.2019 19:25

@zett42 хорошее замечание

Remy Lebeau 23.01.2019 19:31
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
8
6 240
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Пакет SDK для Windows 7 содержит пример с именем значок уведомления. Этот пример содержит строку

ShowWindow(hwnd, nCmdShow);

в своей функции wWinMain. Результатом этого вызова является то, что вы видите окно программы.

Просто измените эту строку на

ShowWindow(hwnd, SW_HIDE);

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

Образец NotificationIcon на GitHub
zett42 23.01.2019 23:03

Другие вопросы по теме