Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Problemilla con Hook (https://www.clubdelphi.com/foros/showthread.php?t=34478)

ixMike 10-08-2006 19:23:52

Problemilla con Hook
 
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:

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


La franja horaria es GMT +2. Ahora son las 21:21:51.

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