La API
RegisterHotKey registra una ventana, en este caso nuestro formulario, para que Windows le envíe un mensaje WM_HOTKEY. Se puede registrar cualquier tecla con un modificador (MOD_ALT, MOD_CONTROL, MOD_SHIFT ó MOD_WIN) en este caso he usado MOD_CONTROL. No puedes registrar botones del ratón. Para recibir el mensaje debes implementar un procedimiento que lo haga, en este caso lo llamé
HotKey y se encarga de procesar el mensaje WM_HOTKEY. Cada tecla registrada tiene un ID con el que la registras, en este caso 0 para 'P' y 1 para 'G'.
HotKey se entera del ID porque le llega en Message.WParam, con lo que ya sabemos que tecla lo disparó.
Para controlar si se pulsó el botón derecho del ratón usamos
GetAsyncKeyState(VK_RBUTTON). Al realizar una operación and binaria con $8000 sabremos si el botón esta pulsado pues en ese caso el resultado será distinto de 0.
Para terminar, debes anular el registro de las teclas con la API
UnregisterHotKey, una llamada por cada tecla registrada usando el identificador que usaste al registrarlas. Esto se puede hacer al finalizar el formulario o cuando ya no precises que tu formulario siga respondiendo al mensaje WM_HOTKEY.
Este sería el código completo de la Unit:
Código Delphi
[-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure HotKey(var Message: TMessage); message WM_HOTKEY;
public
end;
var
Form1: TForm1;
hMouseHook: HHOOK = 0;
implementation
{$R *.dfm}
procedure TForm1.HotKey(var Message: TMessage);
begin
if (GetAsyncKeyState(VK_RBUTTON) and $8000) <> 0 then
begin
if Message.WParam = 0 then Windows.Beep(2000, 200);
if Message.WParam = 1 then Windows.Beep(1000, 200);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotKey(Handle, 0, MOD_CONTROL, Ord('P')); RegisterHotKey(Handle, 1, MOD_CONTROL, Ord('G')); end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnregisterHotKey(Handle, 0);
UnregisterHotKey(Handle, 1);
end;
end.
Yo he utilizado un sonido para mostrar que se detectan las combinaciones de teclas + RBUTTON pero tu deberás poner el código que te parezca.
Saludos.