PDA

Ver la Versión Completa : Problemilla con Hook


ixMike
10-08-2006, 19:23:52
Hola.

Veréis, en un programa que estoy haciendo tengo una barra de estado (TStatusBar), y en los paneles 3 y cuatro muestro el estado de las teclas BloqMaysu y BloqNum. Antes esto lo hacía con la función GetKeyState, y con un TTimer (cada 50 ms checkeaba el estado de las teclas y actualizaba la barra).

Hasta que descubrí los ganchos de teclado (Hooks). Encontré en el club una forma de hacerlos. La prueba funcionaba de maravilla, pero al ponerlo en práctica en mi programa, no funciona.

El código que tengo es este:


type
TfrmPrincipal = class (TForm)
{...}
public
Procedure AppMessage(var Msg: TMsg; var Handled: Boolean);
end;

{...}

procedure TfrmPrincipal.AppMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.Message=WM_HOTKEY then
begin
If GetKeyState(VK_CAPITAL)=1 then Barra.Panels[3].Text:='MAYUS' else Barra.Panels[3].Text:='';
If GetKeyState(VK_NUMLOCK)=1 then Barra.Panels[4].Text:='NUM' else Barra.Panels[4].Text:='';
end;
end;

{...}

initialization
RegisterHotKey(Application.Handle,GlobalAddAtom('mked_1.00b_HotKey_bloqM'), 0, VK_CAPITAL);
RegisterHotKey(Application.Handle,GlobalAddAtom('mked_1.00b_HotKey_bloqN'), 0, VK_NUMLOCK);

finalization
UnRegisterHotKey(Application.Handle,GlobalAddAtom('mked_1.00b_HotKey_bloqM'));
UnRegisterHotKey(Application.Handle,GlobalAddAtom('mked_1.00b_HotKey_bloqN'));



¿Alguien podría decirme qué pasa?

Gracias.

delphi.com.ar
11-08-2006, 01:48:19
Como primera observación, no se trata de un Hook, se trata de una HotKey.
Como segunda observación yo probaría registrarlo directamente a la ventana en cuestión, a no ser que se trate de un MDI, de ser así verificaría que AppMessage este recibiendo los mensajes de la apliación.

Escribí esto, y funciona sin problemas:unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;


type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
protected
aCapital,
aNumLock: ATOM;
procedure WMHotKey(var Message: TWMHotKey); message WM_HOTKEY;
public
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

const
WM_CAPITAL = WM_USER + 1;
WM_NUMLOCK = WM_USER + 2;

procedure TForm1.FormCreate(Sender: TObject);
begin
aCapital := GlobalAddAtom('WM_CAPITAL');
aNumLock := GlobalAddAtom('WM_NUMLOCK');
RegisterHotKey(Handle, aCapital, 0, VK_CAPITAL);
RegisterHotKey(Handle, aNumLock, 0, VK_NUMLOCK);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotKey(Handle, aCapital);
UnRegisterHotKey(Handle, aNumLock);
GlobalDeleteAtom(aCapital);
GlobalDeleteAtom(aNumLock);
end;

procedure TForm1.WMHotKey(var Message: TWMHotKey);
begin
if Message.HotKey = aCapital then
Memo1.Lines.Add('CAPS LOCK');

if Message.HotKey = aNumLock then
Memo1.Lines.Add('NUM LOCK');
end;

end.


Saludos!