C# 捕捉Ctrl+;文本框中的C

C# 捕捉Ctrl+;文本框中的C,c#,winforms,textbox,C#,Winforms,Textbox,尽管我在C#()上工作了多年,但我的大脑还是有一个失灵的时刻,我一辈子都不知道如何捕捉到用户在文本框中键入Ctrl+C 我的应用程序基本上是一个终端应用程序,我希望Ctrl+C将(byte)3发送到串行端口,而不是作为复制到剪贴板的快捷方式 我已在文本框中将快捷方式启用属性设置为false。然而,当用户点击Ctrl+C时,按键事件不会触发 如果我捕获keydown,则当用户按下Ctrl键(即,在他们按下C键之前)时会触发事件 我可能错过了一些非常简单的东西。继续使用KeyDown事件,但在该事件

尽管我在C#()上工作了多年,但我的大脑还是有一个失灵的时刻,我一辈子都不知道如何捕捉到用户在文本框中键入Ctrl+C

我的应用程序基本上是一个终端应用程序,我希望Ctrl+C将
(byte)3
发送到串行端口,而不是作为复制到剪贴板的快捷方式

我已在文本框中将快捷方式
启用
属性设置为false。然而,当用户点击Ctrl+C时,按键事件不会触发

如果我捕获keydown,则当用户按下Ctrl键(即,在他们按下C键之前)时会触发事件


我可能错过了一些非常简单的东西。

继续使用KeyDown事件,但在该事件中,同时检查Ctrl和C,如下所示:

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

另外,为了防止底层文本框处理击键,请将SuppressKeyPress属性设置为true,如图所示。

尝试以下操作:捕获向上箭头和向下箭头事件。当您检测到CTRL的向下箭头时,设置一个标志;检测到向上箭头时,重置标志。如果在设置标志时检测到C键,则使用Ctrl+C


编辑。哎哟杰伊的答案肯定更好。:-)

关键事件按以下顺序发生:

  • 键控
  • 按键
  • 钥匙
  • 按键事件不是由非字符键引发的;但是,非字符关键帧确实会引发KeyDown和KeyUp事件。 控件是非字符键

    您可以使用以下代码行进行检查:
    
    if(e.KeyData==(Keys.Control | Keys.C))
    

    D'oh!我刚想出来。在三个可能的事件中,我没有尝试过的就是我需要的!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;
        }
    }
    
    我在通过
    KeyDown
    捕捉
    文本框上的Ctrl+C时遇到问题。当同时按下
    Control
    C
    时,我才得到
    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();
        }
    }
    

    我不知道这是因为更新版本中的一些更改,还是因为我试图在ListBox上使用它,但在
    KeyEventArgs e
    中没有我从KeyDown获得的
    e.Control

    我必须解决这个问题,我想出了这个(这不是最漂亮的,但效果很好):

    private List KeyBuff=new List();
    私有无效列表框\u KeyDown(对象发送方,KeyEventArgs e)
    {
    如果(!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))
    {
    //期望检测
    剪贴板.SetText(SelectedText);
    }
    }
    私有无效列表框\u KeyUp(对象发送方,KeyEventArgs e)
    {
    KeyBuff.Clear();
    }
    
    对我来说,它不适用于KeyDown事件,所以我尝试了PreviewKeyDown,但效果不错

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

    如果您想在
    按键事件
    中捕捉这些按键组合,请查看以下表格:

    非打印字符
    部分,您可以看到每个组合的Dec编号。 例如,Ctrl+C的Dec编号为
    3
    。因此,您可以在按键事件中捕捉它,如下所示:

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

    你们都比我强。KeyDown对我不起作用,因为我用断点捕捉事件。它在KeyUp上运行得很好,所以我决定参加这个活动。因为这是第一个工作响应而被接受。非常感谢我最终还是找到了答案——看看我自己的答案。我知道,这已经有一段时间了,但对于那些将来会发现这一点的人来说:Shift-Insert仍在处理中,因此需要添加(e.Shift&&e.KeyCode==Keys.Insert)验证。用户还可以右键单击该字段并选择粘贴。。。所以不是100%的证据。不是真的,KeyUp事件捕获是正确的解决方案。
    private void btnTarget_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar != 3) // if it is not Ctrl + C
        {
           // do something
        }
    }