После проверки документации Microsoft по значкам на панели задач (которую я смог найти):
Я заметил, что дескриптор окна (HWND) ТРЕБУЕТСЯ. Это очень плохо для того, что я пытаюсь сделать, так как я хочу создать программу, которая реагирует только на системный трей: она не «сворачивает» окно в трей, она просто использует уведомления (щелчок/ щелчок правой кнопкой мыши по значку) для взаимодействия.
Как мне это сделать?
Боже мой, это серьезно, как это должно работать? Я не могу передать nullptr или что-то в этом роде?
Документы на самом деле объясняют, зачем вам нужно окно: A handle to the window that receives notifications associated with an icon in the notification area.
Только окна могут получать события, так что да, вам определенно нужно как минимум создать скрытое окно.
@ ZeroZ30o Дело в том, что окно, которое вы проходите, является целью сообщений. В Win32 не редкость использовать окна только для передачи сообщений - есть даже концепция окон только для сообщений (без фактической связанной поверхности рисования или чего-то еще).
Верно. Вам нужно окно, чтобы система могла общаться с вами. Только не показывай окно.
Вы можете использовать Окно только для сообщений: "Окно только для сообщений позволяет отправлять и получать сообщения. Он невидим, не имеет z-порядка, не может быть пронумерован и не получает широковещательные сообщения. Окно просто отправляет сообщения."
@RemyLebeau К сожалению, окно только для сообщений не получает WM_QUERYENDSESSION
и другие широковещательные сообщения. Поэтому, если вы хотите корректно завершить работу, а не прерываться, лучше использовать обычное скрытое окно.
@zett42 хорошее замечание
Пакет SDK для Windows 7 содержит пример с именем значок уведомления. Этот пример содержит строку
ShowWindow(hwnd, nCmdShow);
в своей функции wWinMain
. Результатом этого вызова является то, что вы видите окно программы.
Просто измените эту строку на
ShowWindow(hwnd, SW_HIDE);
чтобы скрыть окно программы и отображать только значок в системном трее. Как указывали другие, программе требуется окно программы, даже если оно не видно.
Вы можете создать окно и никогда его не показывать.