Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции-ТРПС.doc
Скачиваний:
13
Добавлен:
15.11.2018
Размер:
810.5 Кб
Скачать

7.6.1. Фокус ввода и активное окно

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

Концепция фокуса ввода тесно связана с концепцией активного окна. Окно, имеющее фокус ввода – это либо активное окно, либо дочернее окно активного окна.

Определить активное окно достаточно просто:

  • Windows выделяет заголовок активного окна;

  • если у активного окна вместо заголовка имеется рамка диалога, то Windows выделяет ее;

  • если активное окно минимизировано, то Windows выделяет текст заголовка в панели задач.

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

Можно обрабатывать сообщения WM_SETFOCUS и WM_KILLFOCUS, чтобы определить какое окно имеет фокус ввода, однако эти сообщения носят чисто информирующий характер. Программный интерфейс Windows содержит две функции, позволяющие узнать или изменить окно, владеющее фокусом ввода, GetFocus() и SetFocus().

7.6.2. Генерация клавиатурных сообщений

Сообщения, которые приложение получает от Windows о событиях, относящихся к клавиатуре, различаются на аппаратные (keystrokes) и символьные (characters). Такое положение соответствует двум представлениям о клавиатуре. Во-первых, клавиатуру можно считать набором клавиш. В клавиатуре имеется только одна клавиша <A>. Нажатие и отпускание этой клавиши представляют собой аппаратные события. Во-вторых, клавиатура также является устройством ввода, генерирующим отображаемые символы. Клавиша <A>, в зависимости от состояния клавиш <Ctrl>, <Shift> и <CapsLock>, может стать источником нескольких символов. Обычно, этим символом является строчная, латинская ‘a’. Если же нажата клавиша <Shift> или установлен режим <CapsLock>, то этим символом является прописная ‘A’. Если же нажата клавиша <Ctrl>, этим символом будет <Ctrl+A>.

Для сочетаний двух аппаратных событий, которые генерируют отображаемые символы, Windows посылает программе и аппаратные, и символьные сообщения. Некоторые клавиши не генерируют символов. Это такие клавиши, как клавиши переключения, функциональные клавиши, клавиши управления курсором и специальные клавиши, например, <Insert> и <Delete>. Для таких клавиш Windows вырабатывает только аппаратные сообщения.

7.6.3. Аппаратные сообщения

Когда пользователь нажимает клавишу, Windows помещает в очередь окна, имеющего фокус ввода, либо сообщение WM_KEYDOWN, либо сообщение WM_SYSKEYDOWN. Когда же клавиша отпускается, Windows посылает в очередь либо сообщение WM_KEYUP, либо сообщение WM_SYSKEYUP. Сообщения WM_SYS... вырабатываются при нажатии клавиш в сочетании с клавишей <Alt>.

Итак, WM_KEYDOWN и WM_KEYUP это несистемные аппаратные сообщения , а системные – WM_SYSKEYDOWN и WM_SYSKEYUP.

Обычно сообщения о нажатии и отпускании появляются парами. Однако, если пользователь оставит клавишу нажатой так, чтобы включился автоповтор, то Windows посылает оконной процедуре серию сообщений WM_KEYDOWN или WM_SYSKEYDOWN и только одно сообщение WM_KEYUP или WM_SYSKEYUP, когда в конце концов клавиша будет отпущена. Аппаратные сообщения клавиатуры являются асинхронными сообщениями, и становятся в очередь сообщений окна.