Ver Mensaje Individual
  #15  
Antiguo 03-07-2024
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.210
Reputación: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Pongo un ejemplo con un Hook a bajo nivel del teclado que bloquea F1 si se pulsa junto con ALT


Código Delphi [-]
...........
var
  WHookKeyboard: HHOOK = 0;

implementation

{$R *.dfm}


function KeyboardHook(Code, wParam, lParam: Integer): Integer; stdcall;
var
  vkCode:    DWORD;
  AltDown:   boolean;
  CtlDown:   boolean;
  ShiftDown: boolean;
begin
  vkCode:= PDWORD(lParam)^;
  AltDown   := (GetAsyncKeyState(VK_LMENU) and $8000 <> 0) or (GetAsyncKeyState(VK_RMENU) and $8000 <> 0);
  CtlDown   := GetAsyncKeyState(VK_CONTROL) and $8000 <> 0;
  ShiftDown := GetAsyncKeyState(VK_SHIFT) and $8000 <> 0;
  if (Code = HC_ACTION and (wParam = WM_KEYDOWN) then
  begin
    if vkCode = VK_F1 then
    begin
      if AltDown then Windows.Beep(1000, 100);
      Result:= 1;
      exit;
    end;
  end;
  Result:= CallNextHookEx(WHookKeyboard, Code, wParam, lParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  WHookKeyboard:= SetWindowsHookEx(13{WH_KEYBOARD_LL}, @KeyboardHook, GetModuleHandle(nil), 0);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  UnhookWindowsHookEx(WHookKeyboard);
end;


El hook tipo WH_KEYBOARD_LL es necesario para que actúe en todo el sistema y la puesta en marcha del hook debe hacerse global para que no falle:
SetWindowsHookEx(WH_KEYBOARD_LL, @KeyboardHook, GetModuleHandle(nil), 0);




Saludos.
Responder Con Cita