2009-10-30 8 views
10

何年もの間C#(Windows Forms)で作業していましたが、私は脳の機能を失うことがありますし、私の人生ではユーザーの入力方法を理解できません。Ctrl + Cをテキストボックスに追加します。テキストボックスでCtrl + Cをキャッチする

私のアプリケーションは、基本的には、端末のアプリケーションである、と私はCtrlキー+Cをクリップボードにコピーするためのショートカットをシリアルポートに(byte)3を送るのではなく、なりたいです。

テキストボックスにショートカットenabledプロパティをfalseに設定しました。しかし、ユーザがを打つと、 + Cとなり、keypressイベントは発生しません。

ユーザーがCtrlキーを押したときに、私は(彼らはCキーを打つ前には、ある)のKeyDownイベント火災をキャッチした場合。

これはおそらく私が行方不明になっている何かばかげた単純です。根底にあるテキストボックスでキーストロークを処理することも防止

if (e.Control && e.KeyCode == Keys.C) { 
    //... 
    e.SuppressKeyPress = true; 
} 

、:

答えて

32

先に行くと、KeyDownイベントを使用しますが、そのような両方CtrlキーCため、そのイベントの確認、中表示されているとおり、SuppressKeyPressプロパティをtrueに設定します。

+0

私は解決策を回避しなければならなかった、私はこの(それはきれいではないのですが、それは正常に動作します)を思い付きました。どうもありがとう。 - 私はそれを最終的に把握しました - 自分の答えを見てください。 – Bryan

+0

私は知っていますが、これはしばらくしていますが、将来これを見つける人にとって:Shift-Insertはまだ処理されているので、(e.Shift && e.KeyCode == Keys.Insert)検証を追加する必要があります。また、ユーザーはフィールドを右クリックして[貼り付け]を選択することもできます。100%プルーフではありません。 – trailmax

1

以下を試してください:上向き矢印および下向き矢印イベントをキャプチャしてください。 CTRLの下矢印を検出すると、フラグを設定します。 上矢印を検出すると、フラグをリセットします。フラグが設定されているときにCキーを検出すると、Ctrl + Cになります。

編集。ああ...ジェイの答えは間違いなく良いです。 :-)

6

キーイベントには、次の順序で発生します。

  1. のKeyDown
  2. KeyPressイベント
  3. keyUpイベント

KeyPressイベントが非文字キーによって提起されていません。ただし、非文字キーはKeyDownおよびKeyUpイベントを発生させます。 コントロールは文字以外のキーです。

あなたのコード行を確認することができます。 if (e.KeyData == (Keys.Control | Keys.C))

3

ああD'!ちょうどそれを考え出した。 3つの可能な出来事のうち、私が試したことのないものが、私が必要とするものです!KeyUpイベントは重要なものです:

private void txtConsole_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData == (Keys.C | Keys.Control)) 
    { 
     _consolePort.Write(new byte[] { 3 }, 0, 1); 
     e.Handled = true; 
    } 
} 
+1

あなたはすべてそれに私を打つ。イベントをキャッチするためにブレークポイントを使用していたので、KeyDownは私のために働いていませんでした。しかし、KeyUpでもうまくいきました。なぜこのイベントを解決したのですか? – Bryan

5

私はKeyDownによってTextBoxはCtrl +Cを引く問題を抱えていました。 ControlCの両方が押されたときに私はControlのキーしか得られなかった。解決策はPreviewKeyDownを使用していました:

private void OnLoad() 
{ 
    textBox.PreviewKeyDown += OnPreviewKeyDown; 
    textBox.KeyDown += OnKeyDown; 
} 

private void OnPreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if (e.Control) 
    { 
     e.IsInputKey = true; 
    } 
} 

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control && e.KeyCode == Keys.C) { 
     textBox.Copy(); 
    } 
} 
+0

実際には、KeyUpイベントキャッチは正しい解決策です。 – TarmoPikaro

1

それは、新しいバージョンまたは私はリストボックスでこれを使用しようとしていますが、私はKeyDownイベントから取得KeyEventArgs eにはe.Controlはありませんので、いくつかの変更ので、だ場合、私は知りません。それが最初の作業の応答だったとして受け入れ

private List<Key> KeyBuff = new List<Key>(); 

private void ListBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (!KeyBuff.Exists(k => k == e.Key)) 
     KeyBuff.Add(e.Key); 

    if (KeyBuff.Exists(k => k == Key.LeftCtrl || k == Key.RightCtrl) && 
     KeyBuff.Exists(k => k == Key.C)) 
    { 
     // Desired detection 
     Clipboard.SetText(SelectedText); 
    } 
} 

private void ListBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    KeyBuff.Clear(); 
}