Here's the code I use for capturing keyboard/mouse input. Hope you can make something out of it.
[pascal]
unit UInput;

interface

uses
Windows;

type
{ .: TInputMouseButton :. }
TInputMouseButton = (btnLeft, btnMiddle, btnRight);

{ .: TInputActionKey :. }
TInputActionKey = (akMoveForward = 0, akBackpedal, akStrafeLeft, akStrafeRight);

{ .: TInputActionKeys :. }
TInputActionKeys = array[TInputActionKey] of Integer;

{ .: TInputManager :. }
TInputManager = class sealed(TObject)
private
{ Private declarations }
FAction: TInputActionKeys;
function GetActionKey(X: TInputActionKey): Integer;
procedure SetActionKey(X: TInputActionKey; const Value: Integer);
public
{ Public declarations }
function IsKeyDown(const KeyCode: Integer): Boolean;
function IsKeyUp(const KeyCode: Integer): Boolean;

function IsMouseButtonDown(const AMouseButton: TInputMouseButton): Boolean;
function GetMousePosition(): TPoint;
procedure SetMousePosition(const DesiredPos: TPoint);

property ActionKeys[X: TInputActionKey]: Integer read GetActionKey write SetActionKey;
end;

implementation

{ TBrainInputManager }

function TInputManager.GetActionKey(X: TInputActionKey): Integer;
begin
Result := FAction[X];
end;

function TInputManager.GetMousePosition: TPoint;
begin
GetCursorPos(Result);
end;

function TInputManager.IsKeyDown(const KeyCode: Integer): Boolean;
begin
Result := (GetAsyncKeyState(KeyCode) < 0);
end;

function TInputManager.IsKeyUp(const KeyCode: Integer): Boolean;
begin
Result := (GetAsyncKeyState(KeyCode) = 0);
end;

function TInputManager.IsMouseButtonDown(
const AMouseButton: TInputMouseButton): Boolean;
begin
Result := False;
case AMouseButton of
btnLeft:
Result := IsKeyDown(VK_LBUTTON);
btnMiddle:
Result := IsKeyDown(VK_MBUTTON);
btnRight:
Result := IsKeyDown(VK_RBUTTON);
end;
end;

procedure TInputManager.SetActionKey(X: TInputActionKey; const Value: Integer);
begin
FAction[X] := Value;
end;

procedure TInputManager.SetMousePosition(const DesiredPos: TPoint);
begin
SetCursorPos(DesiredPos.X, DesiredPos.Y);
end;

end.
[/pascal]