Почему MessageBox блокирует WM_HOTKEY, но не WM_TRAYICON в моей функции WindowProc?

У меня есть структура NOTIFYICONDATAnid, определенная в первом экземпляре 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.

Вопросы, требующие помощи по отладке, обычно должны содержать минимально воспроизводимый пример проблемы, который включает функцию main (или WinMain) и все #include директивы, а также точные входные данные, необходимые для воспроизведения проблемы. Это позволяет другим людям легко протестировать вашу программу, просто используя копирование и вставку.

Andreas Wenzel 28.06.2024 19:42

«зарегистрирован с помощью RegisterHotKey, всем из которых в параметр hWnd было передано значение NULL». Если вы это сделаете, то они будут поступать в виде сообщений потока, которые MessageBox передает в сообщение Dispatch, которое их просто выбрасывает. Зарегистрироваться через окно

Raymond Chen 29.06.2024 04:47

@AndreasWenzel Вопрос содержит достаточно информации, чтобы ответить. Не закрывайте вопрос только потому, что не знаете ответа.

IInspectable 29.06.2024 09:20

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

Dalija Prasnikar 29.06.2024 15:08

Передайте mainWnd в качестве первого параметра в RegisterHotKey().

Hans Passant 29.06.2024 16:25

Модальный диалог, подобный созданному MessageBox, запускает модальный цикл сообщений. Этот цикл обрабатывает и отправляет сообщения, предназначенные для определенного окна; но не знает, что делать с сообщениями, не адресованными ни одному окну, и поэтому сбрасывает их. Я предполагаю, что ваш основной цикл сообщений имеет специальную обработку для сообщений горячих клавиш, но этот цикл не запускается, пока открыт модальный диалог.

Igor Tandetnik 29.06.2024 17:09
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
6
96
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я не могу обрабатывать сообщения WM_HOTKEY, зарегистрированные с помощью RegisterHotKey, все из которых были переданы в параметр hWnd NULL.

Это основная причина (и она такая же, как в вашем предыдущем вопросе).

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

Однако MessageBox() заблокирует ваш цикл сообщений и запустит свой собственный вторичный цикл сообщений, поэтому он будет получать сообщения потока WM_HOTKEY и отбрасывать их, поскольку им некуда идти. Рэймонд Чен описывает это в своем сообщении в блоге: Сообщения тредов съедаются модальными циклами.

Если вы зарегистрируете свои горячие клавиши в своем окне, то цикл сообщений MessageBox() сможет отправлять их на ваш WindowProc, так же, как это делает ваш собственный цикл сообщений.

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