У меня есть структура NOTIFYICONDATA
nid
, определенная в первом экземпляре WM_CREATE
сообщения. Идентификатор сообщения nid
: WM_TRAYICON
. Я обрабатываю сообщение WM_TRAYICON
в WindowProc
, которое связано с nid
сообщениями hWnd
. Когда WM_TRAYICON
обработано, я звоню MessageBox
. Как я сейчас вижу, это похоже на процедуру блокировки. Я не могу обрабатывать сообщения WM_HOTKEY
, зарегистрированные с помощью RegisterHotKey
, и все они были переданы NULL
в их параметр hWnd
. Модальное окно не позволяет мне взаимодействовать с окном, на которое указывает hWnd
, что нормально. Однако сообщения WM_TRAYICON
по-прежнему обрабатываются. При каждом нажатии значка в трее вызывается MessageBox
и появляется новое модальное окно. Мне интересно, может ли кто-нибудь объяснить, что здесь происходит. Значок на панели задач и содержащая его область состояния работают в другом потоке, чем остальная часть программы? Мое понимание потоков элементарно, поэтому я, возможно, неправильно использую это слово.
Я включил ссылку на суть, содержащую весь код, необходимый для запуска программы. Проблема в HandleTrayIconMessage
. Я настроил проект, используя шаблон настольного приложения Windows из Visual Studio 2022.
«зарегистрирован с помощью RegisterHotKey, всем из которых в параметр hWnd было передано значение NULL». Если вы это сделаете, то они будут поступать в виде сообщений потока, которые MessageBox передает в сообщение Dispatch, которое их просто выбрасывает. Зарегистрироваться через окно
@AndreasWenzel Вопрос содержит достаточно информации, чтобы ответить. Не закрывайте вопрос только потому, что не знаете ответа.
@xvymnp Пожалуйста, отредактируйте свой вопрос и включите наиболее релевантный код минимальный воспроизводимый пример по ссылке внутри самого вопроса, а не по ссылке. Ссылки могут стать недействительными. Вы можете оставить ссылку с дополнительным кодом, если это облегчит воспроизведение проблемы в более сложных сценариях, но в идеале весь код должен быть размещен внутри вопроса.
Передайте mainWnd
в качестве первого параметра в RegisterHotKey().
Модальный диалог, подобный созданному MessageBox
, запускает модальный цикл сообщений. Этот цикл обрабатывает и отправляет сообщения, предназначенные для определенного окна; но не знает, что делать с сообщениями, не адресованными ни одному окну, и поэтому сбрасывает их. Я предполагаю, что ваш основной цикл сообщений имеет специальную обработку для сообщений горячих клавиш, но этот цикл не запускается, пока открыт модальный диалог.
Я не могу обрабатывать сообщения WM_HOTKEY, зарегистрированные с помощью RegisterHotKey, все из которых были переданы в параметр hWnd NULL.
Это основная причина (и она такая же, как в вашем предыдущем вопросе).
Вы не регистрируете свои горячие клавиши в своем окне. Таким образом, сообщения WM_HOTKEY
будут поступать в ваше приложение в виде сообщений цепочки, а не оконных сообщений. Ваш WindowProc
может получать только оконные сообщения, поэтому ваш основной цикл сообщений должен будет обрабатывать сообщения WM_HOTKEY
напрямую.
Однако MessageBox()
заблокирует ваш цикл сообщений и запустит свой собственный вторичный цикл сообщений, поэтому он будет получать сообщения потока WM_HOTKEY
и отбрасывать их, поскольку им некуда идти. Рэймонд Чен описывает это в своем сообщении в блоге: Сообщения тредов съедаются модальными циклами.
Если вы зарегистрируете свои горячие клавиши в своем окне, то цикл сообщений MessageBox()
сможет отправлять их на ваш WindowProc
, так же, как это делает ваш собственный цикл сообщений.
Вопросы, требующие помощи по отладке, обычно должны содержать минимально воспроизводимый пример проблемы, который включает функцию
main
(илиWinMain
) и все#include
директивы, а также точные входные данные, необходимые для воспроизведения проблемы. Это позволяет другим людям легко протестировать вашу программу, просто используя копирование и вставку.