The following code fragment shows how to decode a WM_CHAR message containing a valid virtual-key code:
USHORT fsKeyFlags; case WM_CHAR: fsKeyFlags = (USHORT) SHORT1FROMMP(mp1); if (fsKeyFlags & KC_VIRTUALKEY) { /* Get the virtual key from mp2. */ switch (SHORT2FROMMP(mp2)) { case VK_TAB: . . /* Process the TAB key. */ . return TRUE; case VK_LEFT: . . /* Process the LEFT key. */ . return TRUE; case VK_UP: . . /* Process the UP key. */ . return TRUE; case VK_RIGHT: . . /* Process the RIGHT key. */ . return TRUE; case VK_DOWN: . . /* Process the DOWN key. */ . return TRUE; . . /* Etc... */ . default: return FALSE; } }