WM_KEYDOWN ist keine benutzerdefinierte Nachricht. Windows erwartet einen virtual key code, und die sind für Großbuchstaben nunmal Ord('A')-Ord('Z').
Der von Ord zurückgegebene Wert wird übrigens nicht besser, wenn du ihn mit Inttohex in einen String und dann mit StrToInt wieder zurückwandelst.
WM_KEYDOWN sagt nur, dass eine Taste gedrückt wurde - ob das in einem Groß- oder einem Kleinbuchstaben resultiert, entscheidet das Programm selbst (mit TranslateMessage).