Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ayuda explicaxion de hook (https://www.clubdelphi.com/foros/showthread.php?t=91435)

ANCELMO 06-02-2017 18:27:44

ayuda explicaxion de hook
 
alguno me podria ayudar como hacer un hook que solo me capture el clic derecho ctrl+p y ctrl+g

noshy 06-02-2017 23:39:25

Hola, en este hilo puedes encontrar la respuesta:

https://www.clubdelphi.com/foros/showthread.php?t=45462

Saludos

escafandra 07-02-2017 00:51:57

En una primera aproximación podemos escribir el siguiente código que responde a las pulsaciones y en el orden impuesto:
Ctl + RBUTTON + G ó RBUTON + Ctl + G
y
Ctl + RBUTTON + P ó RBUTON + Ctl + P

Código Delphi [-]
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;

Saludos.

ANCELMO 07-02-2017 22:44:09

Cita:

Empezado por escafandra (Mensaje 512982)
En una primera aproximación podemos escribir el siguiente código que responde a las pulsaciones y en el orden impuesto:
Ctl + RBUTTON + G ó RBUTON + Ctl + G
y
Ctl + RBUTTON + P ó RBUTON + Ctl + P

Código Delphi [-]
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;

Saludos.


quisiera saber donde llamar el procedimiento HotKey lo que queda registrado en RegisterHotKey

escafandra 07-02-2017 23:19:39

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
    { Public declarations }
  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   // Ctl + P + VK_RBUTTON
      Windows.Beep(2000, 200);
    if Message.WParam = 1 then   // Ctl + G + VK_RBUTTON
      Windows.Beep(1000, 200);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  RegisterHotKey(Handle, 0, MOD_CONTROL, Ord('P'));   // Ctl + P
  RegisterHotKey(Handle, 1, MOD_CONTROL, Ord('G'));   // Ctl + 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.


La franja horaria es GMT +2. Ahora son las 17:33:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi