2016-11-22 10 views
-2

私は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 
    } 

私はタイマーに正常な機能を使用することを考えていたが、それは電子

+0

'LostFocus'イベントを処理し、ロボットの動きを止めますか?または、あなたのフォームをモーダルにします。 –

+0

それは、キーアップがやっていることです。私はそれを押すと、コマンドをロボットに変えます。もし私がそれを行けば、ロボットは止まる。問題は、フォーカスを失うことなく常にロボットを制御したいということです。 –

+0

フォーカスを失いたくない場合は、モーダルにします。また、KeyIUpを使用すると、フォーカスを失ってからトリガーすることができます。 –

答えて

0

使用グローバルキーフックKeyEventArgsを失われます。また、ウィンドウにフォーカスがないときにキーをキャプチャします(http://www.codeproject.com/Articles/19004/A-Simple-C-Global-Low-Level-Keyboard-HookまたはGlobal keyboard capture in C# application参照)。

また、フォームのLostFocusイベントをキャプチャし、フォームに再度フォーカスが当てられるまでプログラムを中断することもできます。

+0

これは動作する可能性があります。しかし、私はユーティリティのリファレンスを見つけることができません。 –

+0

ソースコードをダウンロードし、プロジェクトに 'globalKeyboardHook.cs 'を追加してください。その後、 'ユーティリティを使う'を使うことができます。 – NikxDa

関連する問題