Jeje, me corrijo a mi mismo. El evento keybd_event parece que no funciona con los juegos. Sin embargo contamos con la función SendInput que lo hace sin problemas. Aquí te dejo el código corregido, esta vez pulso la tecla al pulsar el botón derecho del ratón y suelto la tecla cuando suelto el botón. Probé el código con el Pinball de windows y parece que funciona:
Código Delphi
[-]
const
WH_MOUSE_LL = 14;
KEYEVENTF_SCANCODE = $08;
var
Hook: HHook;
procedure SendKey(Code: Cardinal; KeyUp: Boolean);
var
Input: TInput;
begin
FillChar(Input,Sizeof(Input),0);
Input.Itype:= INPUT_KEYBOARD;
Input.ki.wScan:= MapVirtualKey(Code,0);
if KeyUp then
Input.ki.dwFlags:= KEYEVENTF_SCANCODE or KEYEVENTF_KEYUP
else
Input.ki.dwFlags:= KEYEVENTF_SCANCODE;
SendInput(1,Input,Sizeof(TInput));
end;
function MouseProc(Code: Integer; WParam, LParam: DWORD): LRESULT; stdcall;
begin
if Code = HC_ACTION then
begin
if WParam = WM_RBUTTONDOWN then
SendKey(Ord('Z'),FALSE)
else
if WParam = WM_RBUTTONUP then
SendKey(Ord('Z'),TRUE);
end;
Result := CallNextHookEx(Hook, Code, WParam, LParam);
end;
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Hook <> 0 then UnhookWindowsHookEx(Hook);
end;
procedure TfrmMain.FormCreate(Sender: TObject);
begin
Hook := SetWindowsHookEx(WH_MOUSE_LL, @MouseProc, HInstance, 0);
end;
Aquí te dejo todo montado