A veces es más útil curiosear en las cabeceras o en los fuentes de la VCL, ya que el fuerte de Borland esta claro que no es documentar.Si miras en la cabecera "Controls.hpp" veras que TCMDialogKey no es más que un typedef de TWMKey y el mensaje CM_DIALOGKEY que estamos interceptando y que no tiene equivalente en el API recibe las pulsaciones de teclas especiales.
Lo de que vaya en la parte privada o que el código vaya en la misma cabecera no es obligación, solo lo hago en los ejemplos normalmente por abreviar ya que no se trata de explicar nada sobre el lenguaje.
BEGIN_MESSAGE_MAP es una de las diferentes maneras para capturar un mensaje en una aplicación que hace uso de la VCL, también podemos capturar los mensajes en la cola principal en el evento OnMessage de TApplication o en WndProc de cada ventana.
En una aplicación estándar de Windows que no use ninguna librería de ventanas esta claro que podemos capturar todas las teclas incluido TAB y somos nosotros los que decidimos pasar o no la pulsación a los distintos controles. Pues esto es lo que ocurre en la VCL, que hace esto por nosotros...
Por tanto si queremos capturar las teclas antes de que la VCL haga ese trabajo por nosotros tenemos que hacerlo en la cola principal o bien usar el método anterior que prevee la librería:
Declaramos e implementamos la función siguiente:
void __fastcall TForm1::ApplicationMessages(tagMSG &Msg, bool &Handled)
{
if ( Msg.message==WM_KEYDOWN && Msg.wParam==VK_TAB )
{
ShowMessage("se pulso tab");
// Si no queremos dejar pasar la pulsación
// de esta tecla ponemos Handle a true
Handled = true;
}
}
y en el constructor del Form la siguiente línea:
Application->OnMessage = ApplicationMessages;