Причуды WM_SYSCOMMAND

Приложение получает сообщение WM_SYSCOMMAND, когда пользователь выбирает команду пункта меню в системном меню, и таким образом, wParam может быть SC_CLOSE, SC_CONTEXTHELP, SC_MAXIMIZE, SC_MINIMIZE, SC_RESTORE и т.д. Это логично. (Конечно, можно также отправить эти сообщения путем нажатия на минимизирование, максимизировать, близкие кнопки и т.д.),

Но можно также отправить сообщение WM_SYSCOMMAND для отправки команд в Windows Shell. Например, можно отобразить меню "Пуск" (SC_TASKLIST), активировать экранную заставку (SC_SCREENSAVE) и выключить монитор (SC_MONITORPOWER). Это не имеет смысла, не так ли? Что это имеет отношение к системному меню приложения? Это - больше "системной команды", т.е. больше полностью другой интерпретации имени "WM_SYSCOMMAND" сообщения. Это похоже на сообщение, используется для отправления запросов команды к системе.

Почему это сообщение используется для двух совершенно по-видимому разных вещей, и какая вещь делает имя "SYSCOMMAND", относятся к (команда в системном меню или команда операционной системы)?

1
задан Andreas Rejbrand 2 May 2010 в 22:49
поделиться

2 ответа

Окно получает это сообщение, когда пользователь выбирает команду из меню Window (ранее известного как системное меню или меню управления) или когда пользователь выбирает кнопку максимизации, минимизации, восстановления или закрытия.

Эти WM_SYSCOMMANDs (maximize, minimize, restore, close и те, что находятся в системном меню) могут быть посланы в ваше окно, когда пользователь использует системное меню или кнопки надписей. Я полагаю (мой Win32 очень ржавый), что эти команды обычно обрабатываются DefWindowProc, который делает всю грязную работу и затем посылает уведомление вашему окну (WM_SIZE/WM_SIZING, WM_CLOSE, и т.д.).

Теперь, далее (скрыто в заголовке внизу):

Приложение может выполнить любую системную команду в любое время, передав сообщение WM_SYSCOMMAND в DefWindowProc. Любые сообщения WM_SYSCOMMAND, не обработанные приложением, должны быть переданы DefWindowProc.

Вы также можете выполнить определенную WM_SYSCOMMAND, передав ее в DefWindowProc. К ним относятся те, что упомянуты выше, но также и дополнительные, такие как SC_SCREENSAVE и SC_TASKLIST. Я понятия не имею, какой путь через DefWindowProc должно пройти что-то вроде SC_SCREENSAVE, чтобы в итоге вызвать заставку, но это так.

Итак, как я это вижу, весь класс WM_SYSCOMMANDs - это системные команды. Просто некоторые из них (те, которые доступны из надписи окна) посылаются окну, а другие посылаются окном по вашему усмотрению.

2
ответ дан 3 September 2019 в 00:53
поделиться

WM_SYSCOMMAND - это просто системная версия WM_COMMAND, и она следует той же семантике. Сообщение WM_COMMAND отправляется в ваше приложение, когда пользователь выбирает пункт в меню, нажимает на кнопку, выбирает радиокнопку и т.д. Параметр ID указывает на то, что было нажато. Команда также может быть отправлена вручную, с помощью SendMessage() или PostMessage().

0
ответ дан 3 September 2019 в 00:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: