I have done that. I mean a simple calculator application.
To have keyboard user input, I put a TEdit on the form. This is the only component on the form getting keyboard input. Then at runtime I move the edit out of view:
procedure TCalculatorForm.FormResize(Sender: TObject);
begin
EntryEdit.Left := ClientWidth + 10;
end;
This makes the TEdit invisible but it stay active. When the user type on the keyboard, this TEdit receive the characters. I use the OnKeyPress event to get hand on it and act in the calculation like the user had clicked in the buttons.