2009-12-22 19 views
10

Tengo una aplicación pequeña y pintoresca que muestra un teclado/calculadora en pantalla escrita en Delphi. Me gustaría hacerlo así si presionas 'enter' (en el teclado numérico) estarías presionando '=' y si presionas 'return' (en el teclado principal) estarías presionando 'OK'.Delphi: ¿Puedo diferenciar entre la tecla Entrar del teclado numérico y el retorno del carro?

Hay un botón Aceptar que es el tipo predeterminado del formulario que responde al presionar enter o return. También hay un controlador de eventos onkeydown que podría capturar tanto Enter como Return como vk_return. Pero sus funciones son usurpadas por el botón 'Aceptar' predeterminado.

Si pudiera saber la diferencia entre return y enter, entonces podría deshacerme de mi propiedad predeterminada en el botón Aceptar y presionar el controlador de evento Click del botón OK en la función de teclado, pero desafortunadamente ambos son VK_RETURN.

Respuesta

17

anular el controlador de mensajes WM_KEYDOWN:

procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN; 

ponerlo en práctica, para que solicite el antepasado para nada más que lo que le interesa Puede detectar la diferencia entre la tecla de retorno y la tecla de entrar por la. "extendido" en el campo de mensaje de datos clave:

procedure TForm1.WMKeyDown(var Message: TWMKeyDown); 
const 
    // Message.KeyData format: 
    // [0..15 repCount][16..23 scan code][24 extended bit][25..28 reserved] 
    // [29 context][30 previous state][31 transition state] 
    KD_IS_EXTENDED = 1 shl 24; 
begin 
    if Message.CharCode <> VK_RETURN then 
    begin 
    inherited; 
    Exit; 
    end; 
    if (KD_IS_EXTENDED and Message.KeyData) <> 0 then 
    ShowMessage('Keypad Enter') 
    else 
    ShowMessage('Return'); 
end; 
Cuestiones relacionadas