Получаем символ, соответствующий виртуальной клавише:

Code:

function GetCharFromVKey(vkey: Word): string;

var

keystate: TKeyboardState;

retcode: Integer;

begin

Win32Check(GetKeyboardState(keystate));

SetLength(Result, 2);

retcode := ToAscii(vkey,

   MapVirtualKey(vkey, 0),

   keystate, @Result[1],

   0);

case retcode of

   0: Result := '';

   1: SetLength(Result, 1);

   2: ;

   else

     Result := '';

end;

end;

 

{

Использование:

procedure TForm1.Edit1KeyDown

(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

ShowMessage(GetCharFromVKey(Key));

end;

}

 

В приведенном примере показано как определить нажата ли клавиша Shift при выборе строчки меню. Пример также содержит функции проверки состояния клавиш Alt, Ctrl.

 

Code:

if ((Word(GetKeyState(VK_LSHIFT)) and $8000) <> 0) then

begin

end;

 

if ((Word(GetKeyState(VK_RSHIFT)) and $8000) <> 0) then

begin

end;

 

В событиях, обрабатывающих нажатия клавишь в TForm, клавиша PrintScreen не обрабатывается. Однако проблему можно решить при помощи 'GetAsyncKeyState'. Функция GetAsyncKeyState определяет, когда клавиша была нажата или отпущена каждый раз, когда функция вызвана, а так же, когда клавиша была нажата после предыдущего вызова GetAsyncKeyState.

 Событие OnIdle в TApplication как раз подходит для вызова этой API функции:

Нужно ловить сообщение WM_INPUTLANGCHANGEREQUEST

 

Следующий пример демонстрирует проверку состояния клавиши Shift (нажата она или нет), в то время когда выделен пункт меню. А так же в примере содержатся функции, позволяющие определить состояние клавишь Alt, Ctrl, и shift:

 

· Setup.bat

 

Code:

@echo off

copy HookAgnt.dll %windir%\system

copy kbdhook.exe %windir%\system

start HookAgnt.reg

 

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

 

Для этого можно воспользоваться функцией GetHeapStatus:

Для того, чтобы отличить нажат левый или правый Ctrl, нужно перехватить событие WM_KEYDOWN. В зависимости от состояния 24-ого бита параметра LParam нажата правая или левая клавиша.

 

Code:

procedure EmptyKeyQueue;

var

msg: TMsg;

begin

while PeekMessage(msg, 0, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE or PM_NOYIELD) do

   ;

end;

 

begin

EmptyKeyQueue;

end.