WM_SYSCOMMAND странности - PullRequest
1 голос
/ 03 мая 2010

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

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

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

Ответы [ 3 ]

2 голосов
/ 03 мая 2010

Окно получает это сообщение, когда пользователь выбирает команду из меню «Окно» (ранее известное как системное или управляющее меню) или когда пользователь выбирает кнопку «Развернуть», «Свернуть», «Восстановить» или «Закрыть».

Эти WM_SYSCOMMAND (максимизировать, свернуть, восстановить, закрыть и те, которые находятся в системном меню) могут быть отправлены в ваше окно, когда пользователь использует системное меню или кнопки титров. Я считаю (мой 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 является системными командами. Просто некоторые из них (доступные из заголовка окна) отправляются в окно, а другие отправляются окном на ваше усмотрение.

0 голосов
/ 22 сентября 2017

Это наследие 16 бит Windows.

Пожалуйста, гуглите статью Боба Гундерсона: 《GetMessage и PeekMessage Internals , , Microsoft Developer Network Technology Group , 11 декабря 1992 года

В период Windows 3.1 операционная система была не приоритетной и однопоточной. Когда функция GetMessage / PeekMessage получила доступ к системной очереди и обнаружила нажатие клавиши CTRL-ESC, в активное приложение было отправлено сообщение WM_SYSCOMMAND (помните, что это однопоточная система) с SC_TASKLIST в wParam. Событие нажатия клавиши указало Windows на отображение окна диспетчера задач.

0 голосов
/ 03 мая 2010

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

...