Сведения об ускорителях клавиатуры

Ускорители тесно связаны с меню— они предоставляют пользователю доступ к набору команд приложения. Как правило, пользователи используют меню приложения для изучения набора команд, а затем переключаются на использование ускорителей, так как они становятся более опытными в приложении. Ускорители обеспечивают более быстрый и прямой доступ к командам, чем меню. Как минимум, приложение должно предоставлять ускорители для наиболее часто используемых команд. Хотя ускорители обычно создают команды, которые существуют в виде пунктов меню, они также могут создавать команды, не имеющие эквивалентных пунктов меню.

В этом разделе рассматриваются следующие темы.

Таблицы ускорителей

Таблица ускорителей состоит из массива структур ACCEL , каждая из которых определяет отдельный ускоритель. Каждая структура ACCEL содержит следующие сведения:

  • Сочетание клавиш ускорителя.
  • Идентификатор ускорителя.
  • Различные флаги. Сюда входит один, который указывает, должна ли система предоставлять визуальную обратную связь путем выделения соответствующего пункта меню при использовании ускорителя( если таковой имеется).

Чтобы обработать нажатия клавиш ускорителя для указанного потока, разработчик должен вызвать функцию TranslateAccelerator в цикле сообщений, связанном с очередью сообщений потока. Функция TranslateAccelerator отслеживает ввод с клавиатуры в очередь сообщений, проверяя наличие сочетаний клавиш, соответствующих записи в таблице ускорителей. Когда TranslateAccelerator находит совпадение, он преобразует ввод с клавиатуры (т. е. WM_KEYUP и WM_KEYDOWN сообщения) в WM_COMMAND или WM_SYSCOMMAND сообщение, а затем отправляет его в оконную процедуру указанного окна. На следующем рисунке показано, как обрабатываются ускорители.

модель обработки сочетания клавиш

Сообщение WM_COMMAND содержит идентификатор ускорителя, который привел к созданию сообщения TranslateAccelerator . Процедура окна проверяет идентификатор, чтобы определить источник сообщения, а затем обрабатывает сообщение соответствующим образом.

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

Система также поддерживает таблицы ускорителей для каждого приложения. Приложение может определить любое количество таблиц ускорителей для использования с собственными окнами. Уникальный 32-разрядный дескриптор (HACCEL) идентифицирует каждую таблицу. Однако для указанного потока одновременно может быть активна только одна таблица ускорителей. Дескриптор таблицы ускорителя, передаваемый в функцию TranslateAccelerator , определяет, какая таблица ускорителей активна для потока. Активную таблицу ускорителей можно изменить в любое время, передав другой дескриптор таблицы ускорителя в TranslateAccelerator.

Создание Accelerator-Table

Для создания таблицы ускорителей для приложения требуется выполнить несколько действий. Во-первых, компилятор ресурсов используется для создания ресурсов таблицы ускорителей и их добавления в исполняемый файл приложения. Во время выполнения функция LoadAccelerators используется для загрузки таблицы ускорителя в память и извлечения дескриптора в таблицу ускорителей. Этот дескриптор передается функции TranslateAccelerator для активации таблицы ускорителя.

Таблицу ускорителей также можно создать для приложения во время выполнения путем передачи массива структур ACCEL в функцию CreateAcceleratorTable . Этот метод поддерживает пользовательские ускорители в приложении. Как и функция LoadAccelerators , CreateAcceleratorTable возвращает дескриптор таблицы ускорителя, который можно передать в TranslateAccelerator для активации таблицы ускорителя.

Система автоматически уничтожает таблицы ускорителей, загруженные LoadAccelerators или созданные CreateAcceleratorTable. Однако приложение может освободить ресурсы во время выполнения, уничтожив таблицы ускорителей, которые больше не нужны, путем вызова функции DestroyAcceleratorTable .

Существующую таблицу ускорителей можно скопировать и изменить. Существующая таблица ускорителей копируется с помощью функции CopyAcceleratorTable . После изменения копии дескриптор новой таблицы ускорителей извлекается путем вызова Метода CreateAcceleratorTable. Наконец, дескриптор передается в TranslateAccelerator для активации новой таблицы.

Назначения сочетаний клавиш

Для определения ускорителя можно использовать код символа ASCII или код виртуального ключа. Код символов ASCII делает ускоритель чувствительным к регистру. Таким образом, при использовании символа ASCII "C" ускоритель определяется как ALT+C, а не ALT+C. Однако ускорители с учетом регистра могут запутать в использовании. Например, акселератор ALT+C будет создан, если клавиша CAPS LOCK не работает или клавиша SHIFT не работает, но не в случае отключения обеих клавиш.

Как правило, ускорители не должны учитывать регистр, поэтому большинство приложений используют коды виртуальных ключей для ускорителей, а не коды символов ASCII.

Избегайте ускорителей, которые конфликтуют с мнемоникой меню приложения, так как ускоритель переопределяет мнемонику, что может сбить с толку пользователя. Дополнительные сведения о мнемонике меню см. в разделе Меню.

Если приложение определяет ускоритель, который также определен в таблице системных ускорителей, определенный приложением ускоритель переопределяет системный ускоритель, но только в контексте приложения. Однако избегайте этой практики, так как она не позволяет системным ускорителям выполнять свою стандартную роль в пользовательском интерфейсе. Общесистемные ускорители описаны в следующем списке:

Accelerator Описание
ALT + ESC Переключается на следующее приложение.
ALT+F4 Закрывает приложение или окно.
ALT + ДЕФИС Открывает меню Окно для окна документа.
ALT+PRINT SCREEN Копирует изображение в активном окне в буфер обмена.
ALT + ПРОБЕЛ Открывает меню Окно для окна main приложения.
ALT+TAB Переключается на следующее приложение.
CTRL+ESC Переключение в меню "Пуск ".
CTRL + F4 Закрывает активную группу или окно документа.
F1 Запускает файл справки приложения, если он существует.
ПЕЧАТЬ ЭКРАНА Копирует изображение на экране в буфер обмена.
SHIFT+ALT+TAB Переключается на предыдущее приложение. При нажатии клавиши TAB пользователь должен нажать и удерживать нажатой клавишу ALT+SHIFT.

 

Ускорители и меню

Использование ускорителя аналогично выбору пункта меню. Оба действия приводят к тому, что система отправляет WM_COMMAND или WM_SYSCOMMAND сообщение в соответствующую процедуру окна. Сообщение WM_COMMAND содержит идентификатор, который проверяется процедурой окна для определения источника сообщения. Если ускоритель создал сообщение WM_COMMAND , идентификатором будет идентификатор ускорителя. Аналогичным образом, если элемент меню создал сообщение WM_COMMAND , идентификатор будет идентификатором элемента меню. Так как ускоритель предоставляет ярлык для выбора команды в меню, приложение обычно назначает один и тот же идентификатор ускорителю и соответствующему элементу меню.

Приложение обрабатывает сообщение WM_COMMAND ускорителя точно так же, как соответствующий пункт меню WM_COMMAND сообщение. Однако сообщение WM_COMMAND содержит флаг, указывающий, поступает ли сообщение из ускорителя или пункта меню, если ускорители должны обрабатываться иначе, чем соответствующие элементы меню. Сообщение WM_SYSCOMMAND не содержит этот флаг.

Идентификатор определяет, создает ли ускоритель сообщение WM_COMMAND или WM_SYSCOMMAND . Если идентификатор имеет то же значение, что и пункт меню в меню Система, ускоритель создает WM_SYSCOMMAND сообщение. В противном случае ускоритель создает сообщение WM_COMMAND .

Если ускоритель имеет тот же идентификатор, что и пункт меню, и он неактивен или серый, ускоритель отключается и не создает WM_COMMAND или WM_SYSCOMMAND сообщение. Кроме того, ускоритель не создает командное сообщение, если соответствующее окно свернуто.

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

Ускоритель, соответствующий элементу меню, должен быть включен в текст пункта меню.

Состояние пользовательского интерфейса

Windows позволяет приложениям скрывать или отображать различные функции в пользовательском интерфейсе. Эти параметры называются состоянием пользовательского интерфейса. Состояние пользовательского интерфейса включает следующие параметры:

  • индикаторы фокусировки (например, прямоугольники фокусировки на кнопках)
  • ускорители клавиатуры (обозначены подчеркиванием в подписях элементов управления)

Окно может отправлять сообщения для запроса изменения состояния пользовательского интерфейса, может запрашивать состояние пользовательского интерфейса или применять определенное состояние для дочерних окон. Эти сообщения приведены ниже.

Сообщение Описание
WM_CHANGEUISTATE Указывает, что состояние пользовательского интерфейса должно измениться.
WM_QUERYUISTATE Извлекает состояние пользовательского интерфейса для окна.
WM_UPDATEUISTATE Изменяет состояние пользовательского интерфейса.

 

По умолчанию все дочерние окна окна верхнего уровня создаются с тем же состоянием пользовательского интерфейса, что и их родительские окна.

Система обрабатывает состояние пользовательского интерфейса для элементов управления в диалоговых окнах. При создании диалогового окна система соответствующим образом инициализирует состояние пользовательского интерфейса. Все дочерние элементы управления наследуют это состояние. После создания диалогового окна система отслеживает нажатия клавиш пользователя. Если параметры состояния пользовательского интерфейса скрыты и пользователь перемещается с помощью клавиатуры, система обновляет состояние пользовательского интерфейса. Например, если пользователь нажимает клавишу TAB, чтобы переместить фокус на следующий элемент управления, система вызывает WM_CHANGEUISTATE , чтобы сделать индикаторы фокуса видимыми. Если пользователь нажимает клавишу ALT, система вызывает WM_CHANGEUISTATE , чтобы сделать ускорители клавиатуры видимыми.

Если элемент управления поддерживает навигацию между элементами пользовательского интерфейса, содержащимися в нем, он может обновлять собственное состояние пользовательского интерфейса. Элемент управления может вызывать WM_QUERYUISTATE для получения и кэширования начального состояния пользовательского интерфейса. Всякий раз, когда элемент управления получает сообщение WM_UPDATEUISTATE , он может обновлять состояние пользовательского интерфейса и отправлять WM_CHANGEUISTATE сообщение родительскому элементу. Каждое окно будет продолжать отправлять сообщение родительскому элементу, пока оно не достигнет окна верхнего уровня. Окно верхнего уровня отправляет сообщение WM_UPDATEUISTATE в окна в дереве окна. Если окно не передает WM_CHANGEUISTATE сообщение, оно не достигнет окна верхнего уровня и состояние пользовательского интерфейса не будет обновлено.