Поделиться через


сообщение WM_SYSCOMMAND

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

#define WM_SYSCOMMAND                   0x0112

Example

 case WM_SYSCOMMAND:
        if ((wParam & 0xFFF0) == SC_CLOSE)
        {
            EndDialog (hDlg, TRUE);
            return(TRUE);
        }
        break;

Пример из классических примеров Windows на сайте GitHub.

Параметры

wParam

Тип запрошенной системной команды. Четыре бита с низким порядком параметра wParam используются внутренне системой. Биты 4-15 содержат код команды, который может быть одним из следующих значений.

Ценность Meaning
SC_CLOSE
0xF060
Закрывает окно.
SC_CONTEXTHELP
0xF180
Изменяет курсор на вопросительный знак указателем. Если пользователь щелкает элемент управления в диалоговом окне, элемент управления получает сообщение WM_HELP .
SC_DEFAULT
0xF160
Выбирает элемент по умолчанию; Пользователь дважды щелкнул меню окна.
SC_HOTKEY
0xF150
Активирует окно, связанное с заданным приложением горячим ключом. Параметр lParam определяет окно для активации.
SC_HSCROLL
0xF080
Прокручивается по горизонтали.
SC_KEYMENU
0xF100
Извлекает меню окна в результате нажатия клавиш. Дополнительные сведения см. в разделе с примечаниями.
SC_MAXIMIZE
0xF030
Разворачивает окно.
SC_MINIMIZE
0xF020
Свернуть окно.
SC_MONITORPOWER
0xF170
Задает состояние дисплея. Эта команда поддерживает устройства, имеющие функции экономии питания, такие как персональный компьютер с питанием от батареи.
Параметр lParam может иметь следующие значения:
  • -1 (экран включен)
  • 1 (дисплей собирается с низкой мощностью)
  • 2 (отображение отключается)
SC_MOUSEMENU
0xF090
Извлекает меню окна в результате щелчка мыши.
SC_MOVE
0xF010
Перемещает окно.
SC_NEXTWINDOW
0xF040
Переходит к следующему окну.
SC_PREVWINDOW
0xF050
Переходит к предыдущему окну.
SC_RESTORE
0xF120
Восстанавливает окно в нормальном положении и размере.
SC_SCREENSAVE
0xF140
Выполняет приложение с сохранением экрана, указанное в разделе [boot] файла System.ini.
SC_SIZE
0xF000
Размер окна.
SC_TASKLIST
0xF130
Активирует меню "Пуск ".
SC_VSCROLL
0xF070
Прокручивается по вертикали.

Если код команды SC_SCREENSAVE, в четырех битах низкого порядка доступны следующие флаги:

Flag Meaning
SCF_ISSECURE
0x0001
Средство сохранения экрана безопасно.

lParam

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

Слово с высоким порядком указывает вертикальную позицию курсора в координатах экрана, если выбрана команда меню окна с помощью мыши. Этот параметр равен 1, если команда выбрана с помощью системного акселератора или ноль при использовании mnemonic.

Возвращаемое значение

Приложение должно возвращать ноль, если оно обрабатывает это сообщение.

Замечания

Чтобы получить координаты позиции в координатах экрана, используйте следующий код:

xPos = GET_X_LPARAM(lParam);    // horizontal position 
yPos = GET_Y_LPARAM(lParam);    // vertical position

Функция DefWindowProc выполняет запрос меню окна для предопределенных действий, указанных в предыдущей таблице.

В сообщениях WM_SYSCOMMAND четыре бита с низким порядком параметра wParam используются внутренне системой. Чтобы получить код команды из значения wParam , приложение должно объединить значение 0xFFF0 со значением wParam с помощью битового оператора AND, как показано в приведенном выше примере.

Элементы меню в меню окна можно изменить с помощью функций GetSystemMenu, AppendMenu, InsertMenu, InsertMenu, ModifyMenu, InsertMenuItem и SetMenuItemInfo. Приложения, изменяющие меню окна, должны обрабатывать WM_SYSCOMMAND сообщения.

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

Если защита паролей включена политикой, средство сохранения экрана запускается независимо от того, что приложение делает с уведомлением SC_SCREENSAVE , даже если не удается передать его в DefWindowProc.

Клавиши акселератора, определенные для выбора элементов в меню окна, превратятся в сообщения WM_SYSCOMMAND ; все остальные нажатия клавиш акселератора превратятся в сообщения WM_COMMAND .

Если wParamSC_KEYMENU, lParam содержит код символа ключа, который используется с клавишей ALT для отображения всплывающего меню. Например, нажатие клавиш ALT+F для отображения всплывающего окна "Файл" приведет к WM_SYSCOMMAND с wParam равным SC_KEYMENU и lParam равным f.

Требования

Требование Ценность
Минимальный поддерживаемый клиент
Windows 2000 Профессиональный [только классические приложения]
Минимальный поддерживаемый сервер
Windows 2000 Server [только классические приложения]
Header
Winuser.h (включая Windows.h)

См. также

Справочные материалы

AppendMenu

DefWindowProc

GET_X_LPARAM

GET_Y_LPARAM

GetSystemMenu

InsertMenu

ModifyMenu

WM_COMMAND

Концептуальный

Ускорители клавиатуры