www.pudn.com > racecar.zip > Keyboard.pas
unit Keyboard;
interface
{$IFDEF LINUX}{$Message Error 'Unit not supported'}{$ENDIF LINUX}
uses
Windows;
type
TVirtualKeyCode = Integer;
{: Check if the key corresponding to the given Char is down.
The character is mapped to the main keyboard only, and not to the
numeric keypad.
The Shift/Ctrl/Alt state combinations that may be required to type the
character are ignored (ie. 'a' is equivalent to 'A', and on my french
keyboard, '5' = '(' = '[' since they all share the same physical key). }
function IsKeyDown(c : Char) : Boolean; overload;
{: Check if the given virtual key is down.
This function is just a wrapper for GetAsyncKeyState. }
function IsKeyDown(vk : TVirtualKeyCode) : Boolean; overload;
{: Returns the first pressed key whose virtual key code is >= to minVkCode.
If no key is pressed, the return value is -1, this function does NOT
wait for user input.
If you don't care about multiple key presses, just don't use the parameter. }
function KeyPressed(minVkCode : TVirtualKeyCode = 0) : TVirtualKeyCode;
{: Converts a virtual key code to its name.
The name is expressed using the locale windows options. }
function VirtualKeyCodeToKeyName(vk : TVirtualKeyCode) : String;
{: Converts a key name to its virtual key code.
The comparison is case-sensitive, if no match is found, returns -1.
The name is expressed using the locale windows options, except for mouse
buttons which are translated to 'LBUTTON', 'MBUTTON' and 'RBUTTON'. }
function KeyNameToVirtualKeyCode(const keyName : String) : TVirtualKeyCode;
{: Returns the virtual keycode corresponding to the given char.
The returned code is untranslated, f.i. 'a' and 'A' will give the same
result. A return value of -1 means that the characted cannot be entered
using the keyboard. }
function CharToVirtualKeyCode(c : Char) : TVirtualKeyCode;
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
implementation
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
// ---------------------------------------------------------------------
uses SysUtils;
const
cLBUTTON = 'LBUTTON';
cMBUTTON = 'MBUTTON';
cRBUTTON = 'RBUTTON';
// IsKeyDown
//
function IsKeyDown(c : Char) : Boolean;
var
vk : Integer;
begin
// '$FF' filters out translators like Shift, Ctrl, Alt
vk:=VkKeyScan(c) and $FF;
if vk<>$FF then
Result:=(GetAsyncKeyState(vk)<0)
else Result:=False;
end;
// IsKeyDown
//
function IsKeyDown(vk : TVirtualKeyCode) : Boolean;
begin
Result:=(GetAsyncKeyState(vk)<>0);
end;
// KeyPressed
//
function KeyPressed(minVkCode : TVirtualKeyCode = 0) : TVirtualKeyCode;
var
i : Integer;
buf : TKeyboardState;
begin
Assert(minVkCode>=0);
Result:=-1;
if GetKeyboardState(buf) then begin
for i:=minVkCode to High(buf) do begin
if (buf[i] and $80)<>0 then begin
Result:=i;
Break;
end;
end;
end;
end;
// VirtualKeyCodeToKeyName
//
function VirtualKeyCodeToKeyName(vk : TVirtualKeyCode) : String;
var
nSize : Integer;
begin
// Win32 API can't translate mouse button virtual keys to string
case vk of
VK_LBUTTON : Result:=cLBUTTON;
VK_MBUTTON : Result:=cMBUTTON;
VK_RBUTTON : Result:=cRBUTTON;
else
nSize:=32; // should be enough
SetLength(Result, nSize);
vk:=MapVirtualKey(vk, 0);
nSize:=GetKeyNameText((vk and $FF) shl 16, PChar(Result), nSize);
SetLength(Result, nSize);
end;
end;
// KeyNameToVirtualKeyCode
//
function KeyNameToVirtualKeyCode(const keyName : String) : TVirtualKeyCode;
var
i : Integer;
begin
if keyName=cLBUTTON then
Result:=VK_LBUTTON
else if keyName=cMBUTTON then
Result:=VK_MBUTTON
else if keyName=cRBUTTON then
Result:=VK_RBUTTON
else begin
// ok, I admit this is plain ugly. 8)
Result:=-1;
for i:=0 to 255 do begin
if CompareText(VirtualKeyCodeToKeyName(i), keyName)=0 then begin
Result:=i;
Break;
end;
end;
end;
end;
// CharToVirtualKeyCode
//
function CharToVirtualKeyCode(c : Char) : TVirtualKeyCode;
begin
Result:=VkKeyScan(c) and $FF;
if Result=$FF then Result:=-1;
end;
end.