& lt; img src = «https: //www.thoughtco.com/thmb/Ep_MI0ZSoUFnQZokVpcsr2LK0kM = / 768×0/filters: no_upscale (): max_bytes (15000): strip_icc ().417w, https://www.thoughtco.com/thmb/ceDmJMVPd1u8qv0IrBjqyCqRo = / 534×0/filters: no_upscale (): max_bytes (15000): strip_icc (): format (w5
Considere por un momento la creación de algún juego arcade rápido. Todos los gráficos se muestran, let & amp; apos; s, en un TPainBox. TPaintBox no puede recibir el foco de entrada & amp; # x2014; no se disparan eventos cuando el usuario presiona una tecla; no podemos interceptar las teclas del cursor para mover nuestro acorazado. Delphi ayuda!
Interceptar entrada del teclado
La mayoría de las aplicaciones de Delphi generalmente manejan la entrada del usuario a través de controladores de eventos específicos, aquellos que nos permiten capturar las pulsaciones de teclas del usuario y procesar el movimiento del mouse.
Sabemos que el enfoque es la capacidad de recibir la entrada del usuario a través del mouse o el teclado. Solo el objeto que tiene el foco puede recibir un evento de teclado . Algunos controles, como TImage, TPaintBox, TPanel y TLabel no pueden recibir enfoque. El objetivo principal de la mayoría de los controles gráficos es mostrar texto o gráficos.
Si queremos interceptar la entrada del teclado para controles que no pueden recibir el enfoque de entrada, nosotros & amp; apos; tendremos que lidiar con la API de Windows, ganchos, devoluciones de llamada y mensajes.
Ganchos de Windows
Técnicamente, a & amp; quot; hook & amp; quot; La función es una función de devolución de llamada que se puede insertar en el sistema de mensajes de Windows para que una aplicación pueda acceder a la transmisión de mensajes antes de que se realice otro procesamiento del mensaje. Entre muchos tipos de ganchos de Windows, se llama un gancho de teclado cada vez que la aplicación llama a la función GetMessage () o PeekMessage () y hay un mensaje de teclado WM_KEYUP o WM_KEYDOWN para procesar.
Para crear un gancho de teclado que intercepte toda la entrada del teclado dirigida a un subproceso dado, debemos llamar a la función API SetWindowsHookEx . Las rutinas que reciben los eventos del teclado son funciones de devolución de llamada definidas por la aplicación llamadas funciones de gancho (KeyboardHookProc). Windows llama a su función de enlace para cada mensaje de pulsación de tecla (arriba y tecla hacia abajo) antes de colocar el mensaje en la cola de mensajes de la aplicación & amp; apos; s. La función de gancho puede procesar, cambiar o descartar pulsaciones de teclas. Los ganchos pueden ser locales o globales.
Video destacado
El valor de retorno de SetWindowsHookEx es un identificador del gancho recién instalado. Antes de finalizar, una aplicación debe llamar a la función UnhookWindowsHookEx para liberar los recursos del sistema asociados con el enlace.
Ejemplo de gancho de teclado
Como demostración de los ganchos de teclado, nosotros & amp; apos; ll creamos un proyecto con control gráfico que puede recibir pulsaciones de teclas. TImage se deriva de TGraphicControl, se puede usar como superficie de dibujo para nuestro hipotético juego de batalla. Dado que TImage no puede recibir pulsaciones de teclado a través de eventos de teclado estándar, nosotros & amp; apos; ll creamos una función de gancho que intercepta toda la entrada del teclado dirigida a nuestra superficie de dibujo.
Eventos del teclado de procesamiento de imágenes
Inicie el nuevo Proyecto Delphi y coloque un componente de Imagen en un formulario. Establezca Image1. Alinee la propiedad a alClient. Eso y amp; apos; s para la parte visual, ahora tenemos que hacer algo de codificación. Primero, nosotros & amp; apos; ll necesitamos algunas variables globales:
& lt; pre & gt; var & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; Form1: TForm1; & lt; br & gt ;
& lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; KBHook: HHook; {esto intercepta la entrada del teclado} & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; cx, cy: entero; {track battle ship & amp; apos; s position} & lt; br & gt ;
& lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; {llamada y amp; apos; s declaración} & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; function KeyboardHookProc (Código: Integer; WordParam: Word; LongParam: LongInt): LongInt; stdcall; & lt; br & gt ;
& lt; br & gt ;
implementación & lt; br & gt ;
& lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / pre & gt;…
Para instalar un gancho, llamamos a SetWindowsHookEx en el evento OnCreate de un formulario.
& lt; pre & gt; procedure TForm1.FormCreate (Representador: TObject); & lt; br & gt ;
comenzar & lt; br & gt ;
& amp; amp; nbsp; {Establezca el gancho del teclado para que & amp; amp; nbsp; podamos interceptar la entrada del teclado} & lt; br & gt ;
& amp; amp; nbsp; KBHook: = SetWindowsHookEx (WH_KEYBOARD, & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; & amp; nbsp; & amp; nbsp; & amp; nbsp; & amp; nbsp; & amp; nbsp; & amp; nbsp; & amp; nbsp;
& amp; amp; nbsp; & amp; amp; nbsp; & amp; nbsp; & amp; amp; nbsp; & amp; nbsp; & amp; nbsp; & amp; nbsp; & amp; nbsp; & amp; amp; nbsstance; & amp; nbs;
& amp; amp; nbsp; & amp; amp; nbsp; & amp; nbsp; & amp; amp; nbsp; & amp; nbsp; & amp; nbsp; & amp; nbsp; & amp; nbsp; & amp;
& lt; br & gt ;
& amp; amp; nbsp; {colocar la nave de batalla en & amp; amp; nbsp; el centro de la pantalla} & lt; br & gt ;
& amp; amp; nbsp; cx: = Image1.ClientWidth div 2; & lt; br & gt ;
& amp; amp; nbsp; cy: = Imagen1.ClientHeight div 2; & lt; br & gt ;
& lt; br & gt ;
& amp; amp; nbsp; Imagen1.Canvas.PenPos: = Punto (cx, cy); & lt; br & gt ;
final; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; & lt; / br & gt; & lt; / br & gt; / br & gt; & lt; / br & gt; & lt; / br & gt; & gt; & gt; & gt; & gt; & gt; & gt; & gt; & gt; & gt; & gt; & gt; & gt; & gt; & gt; & gt; & gt; &
Para liberar los recursos del sistema asociados con el enlace, debemos llamar a la función UnhookWindowsHookEx en el evento OnDestroy:
& lt; pre & gt; procedure TForm1.FormDestry (Sender: TObject); & lt; br & gt ;
comenzar & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; {desenganche la intercepción del teclado} & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; UnHookWindowsHookEx (KBHook); & lt; br & gt ;
final; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / pre & gt ;
La parte más importante de este proyecto es el procedimiento de devolución de llamada KeyboardHookProc utilizado para procesar pulsaciones de teclas.
& lt; pre & gt; function KeyboardHookProc (Código: Integer; WordParam: Word; LongParam: LongInt): LongInt; & lt; br & gt ;
comenzar & lt; br & gt ;
& amp; amp; nbsp; case WordParam de & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; vk_Space: {borrar la nave de batalla & amp; apos; s path} & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; begin & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; con Form1.Image1.Canvas do & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; begin & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; Brush.Color: = clWhite; & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; Brush.Style: = bsSolid; & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; Fillrect (Form1.Image1.ClientRect); & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; end; & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; & amp; amp; nbsp; end; & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; vk_Right: cx: = cx + 1; & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; vk_Left: cx: = cx-1; & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; vk_Up: cy: = cy-1; & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; vk_Down: cy: = cy + 1; & lt; br & gt ;
& amp; amp; nbsp; final; {caso} & lt; br & gt ;
& lt; br & gt ;
& amp; amp; nbsp; If cx & amp; lt; 2 entonces cx: = Forma1. Imagen1.ClientWidth-2; & lt; br & gt ;
& amp; amp; nbsp; If cx & amp; gt; Form1.Image1.ClientWidth -2 luego cx: = 2; & lt; br & gt ;
& amp; amp; nbsp; If cy & amp; lt; 2 entonces cy: = Forma1. Imagen1.ClientHeight -2; & lt; br & gt ;
& amp; amp; nbsp; If cy & amp; gt; Form1.Image1.ClientHeight-2 luego cy: = 2; & lt; br & gt ;
& lt; br & gt ;
& amp; amp; nbsp; con Form1.Image1.Canvas do & lt; br & gt ;
& amp; amp; nbsp; begin & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; Pen.Color: = clRed; & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; Brush.Color: = clYellow; & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; TextOut (0,0, Format (& amp; apos;% d,% d & amp; apos;, [cx, cy])); & lt; br & gt ;
& amp; amp; nbsp; & amp; amp; nbsp; Rectangle (cx-2, cy-2, cx + 2, cy + 2); & lt; br & gt ;
& amp; amp; nbsp; end; & lt; br & gt ;
& lt; br & gt ;
& amp; amp; nbsp; Resultado: = 0; & lt; br & gt ;
{Para evitar que Windows pase las pulsaciones de teclas y amp; nbsp; a la ventana de destino, el valor del resultado debe ser & amp; amp; nbsp; be un valor distinto de cero.} & lt; br & gt ;
final; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; / br & gt; & lt; & lt; / br & gt; & gt; & br & gt; & br & gt; & gt; & gt; & lt; & gt; & gt;
Eso y amp; apos; s it. Ahora tenemos el último código de procesamiento de teclado.
Tenga en cuenta solo una cosa: este código no está restringido de ninguna manera para usarse solo con TImage.
La función KeyboardHookProc sirve como KeyPreview general & amp; amp; Mecanismo KeyProcess.
& amp; # x203A; Informática