Cuando presionas la tecla, digamos, flecha derecha, se envía un mensaje con el caracter asociado. El PreTranslateMessage y DispatchMessage se encargan de cambiar códigos binarios, de tal suerte que a tu ventana llega el mensaje WM_KEYPRESS. En el WPARAM te llega el código del mensaje, mientras que en el LPARAM, te llega información adicional (de los bits 0 a 15 las veces que se repitió el mensaje por dejar la tecla presionada, 16-23 indican el código de escaneo, el bit 29 indica el código de contexto: 1 si ALT estaba presionada, etc; el bit 30 determina el estado de la tecla antes de que se enviara este mensaje: 1 si la tecla estaba presionada; y finalmente el bit 31 indica el estado de transición: 1 si la tecla está siendo soltada).
Así en tu función que captura los mensajes de la ventana, bastaría con agregar lo siguiente al "switch":
int nTeclaPresionada;
switch (nMsg)
{
...
case WM_KEYPRESS:
nTeclaPresionada = (int)wParam;
if (nTeclaPresionada == VK_LEFT)
// se presionó la flecha izquierda, hacer algo
;
else if (nTeclaPresionada == VK_RIGHT)
// se presionó la flecha derecha, hacer algo
;
// etc
break;
}
Saludos.