Модель ввода с клавиатуры
Система обеспечивает независимую от устройства поддержку клавиатуры для приложений, устанавливая драйвер устройства клавиатуры, соответствующий текущей клавиатуре. Система обеспечивает независимую от языка поддержку клавиатуры с помощью языковой раскладки клавиатуры, выбранной в данный момент пользователем или приложением. Драйвер устройства клавиатуры получает от клавиатуры коды сканирования, которые отправляются на раскладку клавиатуры, где они преобразуются в сообщения и отправляются в соответствующие окна в вашем приложении.
Каждой клавише на клавиатуре присваивается уникальное значение, называемое кодом сканирования, зависящим от устройства идентификатор клавиши на клавиатуре. Клавиатура генерирует два кода сканирования, когда пользователь вводит клавишу - один, когда пользователь нажимает клавишу, и другой, когда пользователь отпускает клавишу.
Драйвер устройства клавиатуры интерпретирует код сканирования и преобразует (отображает) его в код виртуальной клавиши, независимое от устройства значение, определяемое системой, которое идентифицирует назначение клавиши. После перевода кода сканирования раскладка клавиатуры создает сообщение, которое включает в себя код сканирования, код виртуальной клавиши и другую информацию о нажатии клавиши, а затем помещает сообщение в очередь системных сообщений. Система удаляет сообщение из очереди системных сообщений и отправляет его в очередь сообщений соответствующего потока. В конце концов, цикл сообщений потока удаляет сообщение и передает его в соответствующую оконную процедуру для обработки.
Фокус клавиатуры и активация
Система отправляет сообщения клавиатуры в очередь сообщений потока переднего плана, который создал окно с фокусом клавиатуры. Фокус клавиатуры является временным свойством окна. Система распределяет клавиатуру между всеми окнами на дисплее, перемещая фокус клавиатуры в направлении пользователя от одного окна к другому. Окно с фокусом клавиатуры получает (из очереди сообщений потока, который его создал) все сообщения клавиатуры, пока фокус не изменится на другое окно.
Поток может вызвать функцию GetFocus, чтобы определить, какое из его окон (если есть) имеет фокус клавиатуры. Поток может перевести фокус клавиатуры в одно из своих окон, вызвав функцию SetFocus. Когда фокус клавиатуры изменяется от одного окна к другому, система отправляет сообщение WM_KILLFOCUS окну, потерявшему фокус, а затем отправляет сообщение WM_SETFOCUS окну, которое получило фокус.
Концепция фокусировки клавиатуры связана с концепцией активного окна. Активное окно - это окно верхнего уровня, с которым в данный момент работает пользователь. Окно с фокусом клавиатуры является либо активным окном, либо дочерним окном активного окна. Чтобы помочь пользователю идентифицировать активное окно, система помещает его в верхнюю часть Z-порядка и выделяет его строку заголовка (если оно есть) и границу.
Пользователь может активировать окно верхнего уровня, щелкнув его, выбрав его с помощью комбинации клавиш ALT+TAB или ALT+ESC, или выбрав его из списка задач. Поток может активировать окно верхнего уровня с помощью функции SetActiveWindow. Он может определить, является ли созданное им окно верхнего уровня активным, используя функцию GetActiveWindow.
Когда одно окно деактивировано, а другое активировано, система отправляет сообщение WM_ACTIVATE. Слово младшего разряда параметра wParam равно нулю, если окно деактивируется, и ненулему, если оно активируется. Когда оконная процедура по умолчанию получает сообщение WM_ACTIVATE, она устанавливает фокус клавиатуры на активное окно.
Чтобы заблокировать события ввода с клавиатуры и мыши от доступа к приложениям, используйте BlockInput. Обратите внимание, что функция BlockInput не будет мешать асинхронной таблице состояний ввода клавиатуры. Это означает, что вызов функции SendInput, когда ввод заблокирован, изменит таблицу состояний ввода асинхронной клавиатуры.
Сообщения нажатия клавиш
Нажатие клавиши приводит к тому, что сообщение WM_KEYDOWN или WM_SYSKEYDOWN помещается в очередь сообщений потока, прикрепленную к окну с фокусом клавиатуры. Выпуск ключа приводит к тому, что сообщение WM_KEYUP или WM_SYSKEYUP помещается в очередь.
Сообщения о нажатиях клавиш и нажатия клавиш обычно появляются парами, но если пользователь нажимает клавишу достаточно долго, чтобы запустить функцию автоматического повтора клавиатуры, система генерирует несколько сообщений WM_KEYDOWN или WM_SYSKEYDOWN подряд. Затем он генерирует одно сообщение WM_KEYUP или WM_SYSKEYUP, когда пользователь отпускает ключ.
Системные и несистемные нажатия клавиш Система различает системные нажатия клавиш и несистемные нажатия клавиш. Системные нажатия клавиш генерируют системные сообщения о нажатии клавиш WM_SYSKEYDOWN и WM_SYSKEYUP. Несистемные нажатия клавиш производят несистемные сообщения нажатия клавиш WM_KEYDOWN и WM_KEYUP. Если ваша оконная процедура должна обработать системное сообщение о нажатии клавиши, убедитесь, что после обработки сообщения процедура передает его в функцию DefWindowProc. В противном случае все системные операции, включающие клавишу ALT, будут отключены всякий раз, когда окно имеет фокус клавиатуры. То есть пользователь не сможет получить доступ к меню окна или системному меню или использовать комбинацию клавиш ALT+ESC или ALT+TAB, чтобы активировать другое окно.
Системные сообщения о нажатии клавиш предназначены в основном для использования системой, а не приложением. Система использует их для предоставления встроенного интерфейса клавиатуры для меню и позволяет пользователю контролировать, какое окно активно. Системные сообщения о нажатии клавиш генерируются, когда пользователь вводит клавишу в сочетании с клавишей ALT, или когда пользователь печатает и окно не имеет фокуса клавиатуры (например, когда активное приложение свернуто). В этом случае сообщения публикуются в очереди сообщений, прикрепленной к активному окну.
Сообщения о несистемных нажатиях клавиш предназначены для использования окнами приложений; функция DefWindowProc ничего с ними не делает. Оконная процедура может отбрасывать любые несистемные сообщения нажатия клавиш, которые ей не нужны.
Описанные коды виртуальных клавиш Параметр wParam сообщения о нажатии клавиши содержит код виртуальной клавиши, которая была нажата или отпущена. Оконная процедура обрабатывает или игнорирует сообщение о нажатии клавиши, в зависимости от значения кода виртуальной клавиши.
Типичная оконная процедура обрабатывает только небольшое подмножество сообщений о нажатии клавиш, которые она получает, и игнорирует остальные. Например, оконная процедура может обрабатывать только сообщения нажатия клавиш WM_KEYDOWN и только те, которые содержат коды виртуальных клавиш для клавиш перемещения курсора, клавиш Shift (также называемых клавишами управления) и функциональных клавиш. Типичная оконная процедура не обрабатывает сообщения нажатия клавиш от символьных клавиш. Вместо этого он использует функцию TranslateMessage для преобразования сообщения в символьные сообщения. Для получения дополнительной информации о TranslateMessage и символьных сообщениях см. Символические сообщения.
Для получения дополнительной информации см. Полную версию здесь:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms646267(v=vs.85).aspx
Чтобы конкретно ответить на ваш вопрос, если приложение хочет перехватить системное нажатие клавиши, оно должно перехватить его в очереди системных сообщений, а это не то, как обычно работают приложения. Система автоматически создаст специальную очередь для каждого приложения, которая более эффективна для использования приложением, поскольку эта очередь не включает сообщения, предназначенные для других приложений. Системная очередь содержит все сообщения для всех приложений, что означает, что любое приложение, которое ее читает, должно выбросить много ненужных сообщений.