¿Cómo capturar mensajes de Windows a nivel de aplicación? El ejemplo cambia el punto decimal del teclado numérico por una coma, como lo hace el Excel.

Capturando mensajes de Windows a nivel de aplicación

Copyright © 2000 Ernesto De Spirito

Boletín Pascal. Newsletter gratuito para programadores Delphi (y Kylix) con artículos, noticias, trucos, componentes y enlaces a nuevo contenido Delphi en la red.

A veces necesitamos capturar los mensajes de Windows a nivel de la aplicación. Una forma es con un "hook" (gancho), y la otra es usando el evento Message del objeto Application que se produce cada vez que la aplicación recibe un mensaje de Windows. Vamos a seguir el segundo camino. Hay dos formas de establecer un manejador para este evento: una es usando un objeto ApplicationEvents que viene con Delphi 5 (simplemente hay que hacer doble-clic en el cuadro combinado del evento OnMessage en el Inspector de Objetos) y la otra es haciéndolo a mano:

  1. En la sección privada de su formulario principal agregue la siguiente declaración:

    procedure ApplicationMessage(var Msg: TMsg; var Handled: Boolean);
  2. Asigne la propiedad OnMessage en el evento Create del formulario, por ejemplo:

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMessage := ApplicationMessage;
    end;
  3. Cuando desee dejar de capturar mensajes todo lo que tiene que hacer es establecer OnMessage en nil:

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Application.OnMessage := nil;
    end;

Finalmente debe implementar el procedimiento. Por ejemplo, vamos a atrapar los mensajes de teclado WM_KEYUP y WM_KEYDOWN para convertir el punto decimal del teclado numérico en una coma (esto es útil en aplicaciones hispanas).

procedure TForm1.ApplicationMessage(var Msg: TMsg;
  var Handled: Boolean);
begin
  case Msg.Message of
  WM_KEYDOWN, WM_KEYUP:
    case Msg.wParam of
    // Reemplazar el punto del teclado numerico (key code = 110)
    // por una coma (key code = 188).
    110: Msg.wParam := 188;
    end;
  end;
end;

Ahora puede colocar un control Edit en su formulario y probarlo.

JfControls Library - para Delphi y C++ Builder