Delphi. Трюки и эффекты - страница 32

Шрифт
Интервал

стр.

end;

//Определяем код типа производителя

txtSubtype.Text := IntToStr(GetKeyboardType(1));

//Определяем количество функциональных клавиш

txtKeys.Text := IntToStr(GetKeyboardType(2));

end;

При создании формы происходит заполнение текстовых полей информацией о типе клавиатуры, коде типа, присвоенном производителем, и количестве функциональных клавиш.

Пример возможного результата определения информации о клавиатуре приводится на рис. 3.2.

Рис. 3.2. Информация о клавиатуре

Опрос клавиатуры

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

В листинге 3.17 приводится пример обработчика события TimerlTimer, определяющего, нажаты ли клавиши ↑, ↓, ←, →, а также пробел, Enter, Ctrl (правый) и Alt (правый).

...

Листинг 3.17.

Определение состояния некоторых клавиш

procedure TForm1.Timer1Timer(Sender: TObject);

var

buttons: TKeyBoardstate;

begin

//Получаем состояния клавиш

GetKeyboardState(buttons);

//Отобразим состояния клавиш

//..пробел

if buttons[VK_SPACE] and 128 <> 0 then

SendMessage(cmbSpace.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbSpace.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..enter

if buttons[VK_RETURN] and 128 <> 0 then

SendMessage(cmbEnter.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbEnter.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..правый Ctrl

if buttons[VK_RCONTROL] and 128 <> 0 then

SendMessage(cmbRCtrl.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbRCtrl.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..правый Alt

if buttons[VK_RMENU] and 128 <> 0 then

SendMessage(cmbRAlt.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbRAlt.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..правый Shift

if buttons[VK_RSHIFT] and 128 <> 0 then

SendMessage(cmbRShift.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbRShift.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..вверх

if buttons[VK_UP] and 128 <> 0 then

SendMessage(cmbUp.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbUp.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..вниз

if buttons[VK_Down] and 128 <> 0 then

SendMessage(cmbDown.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbDown.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..влево

if buttons[VK_LEFT] and 128 <> 0 then

SendMessage(cmbLeft.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbLeft.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

//..вправо

if buttons[VK_RIGHT] and 128 <> 0 then

SendMessage(cmbRight.Handle, BM_SETSTATE, BST_CHECKED, 0)

else

SendMessage(cmbRight.Handle, BM_SETSTATE, BST_UNCHECKED, 0);

end;

Для того чтобы определить состояние клавиш, можно использовать API-функцию GetKeyboardState, которая заполняет массив buttons (на самом деле тип TKeyBoardstate определен как array [0. 255] of Byte) значениями, характеризующими, нажата ли клавиша. Причем значения в массиве buttons трактуются следующим образом:

• если установлен старший бит (проверка чего и делается в листинге 3.17), то клавиша в данный момент нажата;

• если установлен младший бит, то функция, закрепленная за этой клавишей (например, Caps Lock), включена.

Для индексации массива можно использовать ASCII-коды символов, а также константы, соответствующие несимвольным клавишам (обозначения и коды для таких клавиш приводятся в приложении 1).

Каждой контролируемой клавише (листинг 3.17) соответствует кнопка на форме. Для принудительной установки кнопки в нажатое или ненажатое состояние используется посылка сообщения BMSETSTATE. Пример определения состояния клавиш в некоторый момент времени показан на рис. 3.3.

Рис. 3.3. Состояние некоторых клавиш клавиатуры

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

Имитация нажатия клавиш

Состояние клавиш на клавиатуре можно не только определять, его также можно программно изменять. Рассмотрим один из способов программного нажатия клавиш, который крайне прост благодаря наличию API-функции keybdevent, как раз и предназначенной для имитации клавиатурного ввода.


стр.

Похожие книги