Ver Mensaje Individual
  #17  
Antiguo 04-07-2024
buenarquero buenarquero is offline
Miembro
 
Registrado: feb 2008
Posts: 33
Reputación: 0
buenarquero Va por buen camino
¡Gracias!

Cita:
Empezado por escafandra Ver Mensaje
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.
¡Gracias por tu aportación! No tengo ni idea de como adaptar el código para capturar solo las teclas de función sin Alt o si funcionará tal cual solo con la tecla de función, pero lo probaré. Lo que me gustaría que me explicaras es lo de que el hook hay que hacerlo a nivel global. ¿Que hay que hacer para que sea a nivel global? ¿no está implícito en el código? ¿Hay que declarar la función en una parte determinada del .Pas?

Última edición por buenarquero fecha: 04-07-2024 a las 11:46:45.
Responder Con Cita