пятница, 17 октября 2008 г.

WinAPI: Полезности в Delphi. getasynckeystate

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

О.Отлавливаем нажатие на клавиши.
Как вы знаете нажатие на клавишу мыши можно отследить при события MouseDown. Нам же нужно отследить какая клавиша нажата и вывести ее на экран. Для этого существуют 3 процедуры (аналогичные мышке) это 

KeyPress – нажатие
KeyDown – только нажатие
KeyUp – отпускание клавиши 

Создай новое приложение. Помести на форму 1 Label, и создай обработчик KeyDown для формы.

У этого события есть параметр Key сюда нужно записывать ANSII код клавиши. Все коды можно посмотреть здесь 
http://www.realcoding.net/article/view/1857.
Так, а вот и обработчик:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=51 then
Label1.Caption:='Ты нажал клавишу "3"';
end;

Теперь если жмакнешь по клавиши 3 появиться эта надпись.
Так вот. Думаю, ты понял, что отлавливать события нажатия на клавишу тут мы можем только у нашей формы или ее компонентов.

А если хочется и во всем Windows клавиши отлавливать.
Для этого существует API функция getasynckeystate в качестве параметра ей нужно указать виртуальный код клавиши, которую хотим отлавливать.
Вот список виртуальных кодов

vk_lbutton = $01;
vk_rbutton = $02;
vk_cancel = $03;
vk_mbutton = $04;
vk_back = $08;
vk_tab = $09;
vk_clear = $0c;
vk_return = $0d;
vk_shift = $10;
vk_control = $11;
vk_menu = $12;
vk_pause = $13;
vk_capital = $14;
vk_escape = $1b;
vk_space = $20;
vk_prior = $21;
vk_next = $22;
vk_end = $23;
vk_home = $24;
vk_left = $25;
vk_up = $26;
vk_right = $27;
vk_down = $28;
vk_select = $29;
vk_print = $2a;
vk_execute = $2b;
vk_snapshot = $2c; 
vk_insert = $2d;
vk_delete = $2e;
vk_help = $2f;
>> vk_a - vk_z такие же, как и их ascii-эквиваленты: 'a' - 'z' ($41 - $5A)<< >> vk_0 - vk_9 такие же, как и их ascii-эквиваленты: '0' - '9' ($30 - $39)}
vk_numpad0 = $60;
vk_numpad1 = $61;
vk_numpad2 = $62;
vk_numpad3 = $63;
vk_numpad4 = $64;
vk_numpad5 = $65;
vk_numpad6 = $66;
vk_numpad7 = $67;
vk_numpad8 = $68;
vk_numpad9 = $69;
vk_multiply = $6a;
vk_add = $6b;
vk_separator = $6c;
vk_subtract = $6d;
vk_decimal = $6e;
vk_divide = $6f;
vk_f1 = $70;
vk_f2 = $71;
vk_f3 = $72;
vk_f4 = $73;
vk_f5 = $74;
vk_f6 = $75;
vk_f7 = $76;
vk_f8 = $77;
vk_f9 = $78;
vk_f10 = $79;
vk_f11 = $7a;
vk_f12 = $7b;
vk_f13 = $7c;
vk_f14 = $7d;
vk_f15 = $7e;
vk_f16 = $7f;
vk_f17 = $80;
vk_f18 = $81;
vk_f19 = $82;
vk_f20 = $83;
vk_f21 = $84;
vk_f22 = $85;
vk_f23 = $86;
vk_f24 = $87;
vk_numlock = $90;
vk_scroll = $91;

Теперь кинь на форму таймер и установи интервал в 500 мс. Вот обработчик

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if getasynckeystate($1b)<>0 then
Label1.Caption:='Вы нажали «ESC»';
end;

Думаю тут все понятно. Теперь при наличии мозгов можно написать простенький клавиатурный шпион.

Комментариев нет: