I had this problem with a game I'm building. It seems that the keycode is getting "handled" and set to null before it ever even gets to the form. It looks like they are only passing things through when the ALT or CTRL keys are pressed.
To solve this particular problem, I commented out a line in FMX.Platform.Win
procedure CurrentChar(Msg: tagMsg; var Key: Word; var Ch: WideChar; var Shift: TShiftState);
begin
Key := wParam;
Ch := WideChar(Msg.wParam);
Shift := KeyDataToShiftState(lParam);
if (Ch >= ' ') then
begin
if ((Shift * [ssAlt, ssCtrl]) = [ssAlt, ssCtrl]) then
begin
Shift := Shift - [ssAlt, ssCtrl];
end;
end;
if ((([ssAlt, ssCtrl, ssCommand] * Shift) <> []) or (Ch < ' ')) and (Key > 0) then
Ch := #0;
end;
What I did FIRST though is I copied FMX source folder into your own private source tree and built it from there. Then your apps will build with any minor patches you put into it, but it is simpler than installing hacked design-time packages.
Once you have your own private FMX source, then you can start hacking it (which you will have to do from time to time).
The first thing you should do when starting a new project, is copy the FMX source folder into your own private source tree and build from there.
FMX still has a way to go before it is a comprehensive cross platform solution, but it is getting closer, so you'll have to mess with it occasionally. Using similar approaches, I added Android pen support, fixed some BLE issues... you'll probably come across your own things.