El secreto de simular pulsaciones de teclado es el intervalo entre que se presiona la tecla y se suelta, si este es muy corto algunos programa ni se darán cuenta de que la tecla se ha pulsado. En el siguiente ejemplo lo que hago es utilizar el evento WM_RBUTTONUP para activar o desactivar un Timer, dentro del evento del timer voy alternativamente presionando y soltando la tecla. Es solo un ejemplo se puede mejorar:
Revisa el zip para ver el código completo:
Código Delphi
[-]
function MouseProc(Code: Integer; WParam, LParam: DWORD): LRESULT; stdcall;
begin
if Code = HC_ACTION then
begin
if WParam = WM_RBUTTONUP then
frmMain.Timer1.Enabled:= not frmMain.Timer1.Enabled;
end;
Result := CallNextHookEx(Hook, Code, WParam, LParam);
end;
procedure TfrmMain.Timer1Timer(Sender: TObject);
begin
if Abajo then
SendKey(Ord('Z'),TRUE)
else
SendKey(Ord('Z'),FALSE);
Abajo:= not Abajo;
end;