私はMain_Form_KeydownとKeyup機能を使用して、キーボードでロボットを制御します。 問題は、私はメインフォームウィンドウのフォーカスを失った場合、私は再びそれを集中し、それをやっている間、私はロボットをクラッシュする可能性がありますので、それは問題でない限り、私はもう、ロボットを制御することはできませんことです。KeyDown機能を改善する方法
私のコードをどのように改善できますか?
public void Main_Form_KeyDown(object sender, KeyEventArgs e) //Controlo do drone com o teclado
{
switch (e.KeyCode) //Controlo pelo Teclado
{
case Keys.F:
_droneClient.FlatTrim();
break;
case Keys.Back:
if (!isSensitiveMode)
{
flightSensitivityConst = 0.25f;
isSensitiveMode = true;
}
else
{
flightSensitivityConst = 0.9f;
isSensitiveMode = false;
}
break;
case Keys.W:
_droneClient.Progress(FlightMode.Progressive, pitch: -flightSensitivityConst);
break;
case Keys.S:
_droneClient.Progress(FlightMode.Progressive, pitch: +flightSensitivityConst);
break;
case Keys.A:
_droneClient.Progress(FlightMode.Progressive, roll: -flightSensitivityConst);
break;
case Keys.D:
_droneClient.Progress(FlightMode.Progressive, roll: +flightSensitivityConst);
break;
case Keys.I:
_droneClient.Progress(FlightMode.Progressive, gaz: +flightSensitivityConst);
break;
case Keys.K:
_droneClient.Progress(FlightMode.Progressive, gaz: -flightSensitivityConst);
break;
case Keys.J:
_droneClient.Progress(FlightMode.Progressive, yaw: -flightSensitivityConst);
break;
case Keys.L:
_droneClient.Progress(FlightMode.Progressive, yaw: +flightSensitivityConst);
break;
case Keys.E:
_droneClient.Takeoff();
break;
case Keys.Q:
_droneClient.Emergency();
break;
case Keys.Space:
_droneClient.Land();
break;
//FLIPS
case Keys.P:
_settings.Control.FlightAnimation = new FlightAnimation(FlightAnimationType.FlipLeft);
_droneClient.Send(_settings);
//FLIP
break;
case Keys.O:
_settings.Control.FlightAnimation = new FlightAnimation(FlightAnimationType.FlipRight);
_droneClient.Send(_settings);
//FLIP
break;
case Keys.Y:
_settings.Control.FlightAnimation = new FlightAnimation(FlightAnimationType.FlipBehind);
_droneClient.Send(_settings);
break;
case Keys.U:
_settings.Control.FlightAnimation = new FlightAnimation(FlightAnimationType.FlipAhead);
_droneClient.Send(_settings);
break;
case Keys.C:
var configuration = new Settings();
configuration.Video.Channel = VideoChannelType.Next;
_droneClient.Send(configuration);
break;
case Keys.R:
string path = string.Format("ttu_flight_{0:yyyy_MM_dd_HH_mm}" + ARDroneTrackFileExt, DateTime.Now);
using (var dialog = new SaveFileDialog { DefaultExt = ARDroneTrackFileExt, Filter = ARDroneTrackFilesFilter, FileName = path })
{
if (dialog.ShowDialog(this) == DialogResult.OK)
{
StopRecording();
_recorderStream = new FileStream(dialog.FileName, FileMode.OpenOrCreate);
_packetRecorderWorker = new PacketRecorder(_recorderStream);
_packetRecorderWorker.Start();
}
}
break;
}
} //Controlo do drone através do teclado
private void Main_Form_KeyUp(object sender, KeyEventArgs e) //Se nao estiver a ser comandado pelo teclado
{
_droneClient.Hover(); //Fica pairado
}
私はタイマーに正常な機能を使用することを考えていたが、それは電子
'LostFocus'イベントを処理し、ロボットの動きを止めますか?または、あなたのフォームをモーダルにします。 –
それは、キーアップがやっていることです。私はそれを押すと、コマンドをロボットに変えます。もし私がそれを行けば、ロボットは止まる。問題は、フォーカスを失うことなく常にロボットを制御したいということです。 –
フォーカスを失いたくない場合は、モーダルにします。また、KeyIUpを使用すると、フォーカスを失ってからトリガーすることができます。 –