web-dev-qa-db-ja.com

テキストボックスでCtrl + Cをキャッチ

私は何年もC#( Windows Forms )を使用していますが、脳の障害が発生していて、ユーザーの入力をキャッチする方法を一生理解できません。 CtrlC テキストボックスに。

私のアプリケーションは基本的にターミナルアプリケーションであり、 CtrlC Copy to Clipboardのショートカットではなく、(byte)3をシリアルポートに送信します。

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

キーダウンをキャッチすると、ユーザーが押すとイベントが発生します Ctrl (つまり、ヒットする前に C キー)。

私が見逃しているのは、おそらくばかげて単純なことです。

16
Bryan

先に進み、KeyDownイベントを使用しますが、その場合はbothを確認してください。 Ctrl そして C、 そのようです:

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

また、基になるTextBoxによるキーストロークの処理を防ぐには、図のようにSuppressKeyPressプロパティをtrueに設定します。

37
Jay Riggs

重要なイベントは次の順序で発生します。

  1. KeyDown
  2. KeyPress
  3. KeyUp

KeyPressイベントは、文字以外のキーでは発生しません。ただし、文字以外のキーはKeyDownイベントとKeyUpイベントを発生させます。コントロールは文字以外のキーです。

次のコード行で確認できます:if (e.KeyData == (Keys.Control | Keys.C))

7
ZokiManas

キャッチに問題がありました CtrlCTextBox by KeyDownControlControlの両方が押されたときにのみ、Cキーを取得しました。解決策は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();
    }
}
6
Hacko

D'oh!ちょうどそれを理解しました。考えられる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;
    }
}
3
Bryan

次のことを試してください。 up arrow そして down arrow イベント。検出したとき down arrow CTRLの場合、フラグを設定します。検出したとき up arrow、フラグをリセットします。を検出した場合 C フラグが設定されている間にキーを押すと、 Ctrl+C

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

1
Konamiman

新しいバージョンでの変更によるものなのか、これをListBoxで使用しようとしているためなのかはわかりませんが、KeyDownから取得したe.ControlにはKeyEventArgs eがありません。

私は解決策を回避する必要がありました、私はこれを思いつきました(それは最も美しいものではありませんが、それはうまくいきます):

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();
}
1
L. Zeda

KeyPress Eventでこのようなキーの組み合わせをキャッチしたい場合は、次の表を参照してください。

http://www.physics.udel.edu/~watson/scen103/ascii.html

Non-Printing Charactersセクションでは、各組み合わせのDec番号を確認できます。たとえば、 CtrlC3です。したがって、次のようにKeyPressイベントでキャッチできます。

private void btnTarget_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar != 3) // if it is not Ctrl + C
    {
       // do something
    }
}
1
Inside Man

私の場合、KeyDownイベントでは機能しないため、PreviewKeyDownで試してみましたが、機能しました。

private void txt_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
  if (e.Control == true && e.KeyCode == Keys.C)
  {
    Clipboard.SetText(txt.SelectedText);
  }
}
0
Anoopkumar