Hallo,
wenn deine procedure nicht asynchron läuft, sollte es absolut keinen unterschied machen - die tastendrücke werden in die nachrichten-warteschlange gepackt und werden dann nach ende deiner prozedur abgearbeitet.
Ansonsten deklariere eine (form-)globale Boolean-Variable "Working" und mach es so:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if not working then
begin
working := true;
machwas;
working := false;
end;
end;