Muchas gracias por la ayuda Neftalí. Con tus consejos al final lo he conseguido.
He conseguido poner el código en el evento AppMessage del formPrincipal por lo cual me sirve para todos los formularios de la aplicación.
Al final se ha quedado algo así, sé que es mejorable, por ahora no tengo demasiado tiempo, por lo que con que medio funcione me vale:
Código:
procedure TfrmPrincipal.AppMessage(var Msg: TMSg; var Handled:Boolean);
var
actual : TWincontrol;
tmp : TWincontrol;
FrmActual: TForm;
i: integer;
begin
if ((Msg.wParam) = VK_F2) and (Msg.lParam>3500000) then
begin
TRY
FrmActual:=Screen.ActiveForm;
Actual := Screen.ActiveControl;
for i:=0 to FrmActual.ControlCount do
begin
if (frmActual.Controls[i] is Twincontrol) then
begin
tmp:=(frmActual.Controls[i] as twincontrol);
if (tmp.Parent=actual.Parent) and (tmp.tabOrder=actual.TabOrder-1) then
begin
tmp.SetFocus;
exit;
end;
end;
end;
except
actual.Parent.SetFocus;
end;
end;
end;