WM_SYSCOMMAND странности

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

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

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

4 ответа

Решение

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

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

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

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

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

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

WM_SYSCOMMANDэто системная версия WM_COMMANDс большинством неклиентских действий, направляемых через ваше окно, чтобы вы могли их изменить/съесть.

SC_SCREENSAVEотправляется системой в окно переднего плана по истечении таймера экранной заставки. Это дает окну переднего плана возможность блокировать экранную заставку, не передавая сообщение DefWindowProc. Это полезно для видеоплееров, программ для презентаций (PowerPoint и т. д.) и игр.

я не знаю почему SC_TASKLIST(это только команда, которую вы можете отправить) сгруппирована с этими другими командами, но, вероятно, для этого есть какая-то устаревшая причина. Помните, что Win 3.x и 95/98/ME имеют очень разные «диспетчеры задач», а также поставляются с небольшим приложением задач, которое действует как плавающая панель задач:

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