在一个文本框追赶按Ctrl + C(Catching Ctrl + C in a textbox)

2019-09-02 17:41发布

尽管我与C#(工作Windows窗体 )多年来,我有一个大脑失败的时刻,而不能为我的生活弄清楚如何捕捉用户按下Ctrl + C到一个文本框。

我的应用程序基本上是一个终端应用,我想按Ctrl + C(byte)3到串行端口,而不是成为快捷方式复制到剪贴板。

我已经设置了快捷键enabled属性设置为false在文本框。 然而,当用户点击Ctrl + C ,键击事件不会触发。

那我要是追到的keydown,事件触发当用户按下CTRL(也就是说,他们打C键之前)。

这也可能是东西太简单,我很想念。

Answer 1:

继续使用KeyDown事件,但在两个 Ctrl键C,等,使得事件的检查:

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

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



Answer 2:

关键事件发生的顺序如下:

  1. 的KeyDown
  2. 按键
  3. KEYUP

按键事件不是由非字符键提高; 然而,非字符键不提高的KeyDown和KeyUp事件。 控制是一个非字符键。

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



Answer 3:

我曾在一个醒目按Ctrl + C的一个问题TextBox通过KeyDown 。 我只得到了Control键当两个ControlC被压。 该解决方案是使用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();
    }
}


Answer 4:

D'哦! 只要理解了它。 出了三种可能的事件,我没有尝试过的一个是我需要的一个! 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;
    }
}


Answer 5:

尝试以下方法:捕捉向上向下箭头事件。 当你发现向下箭头 CTRL,设置一个标志; 当你发现了箭头 ,复位标志。 如果您发现C键,同时设置了标志,你必须按Ctrl + C。

编辑 。 哎哟......周杰伦的答案是肯定更好。 :-)



Answer 6:

我不知道这是否是因为在新版本或者是因为某些变化我想使用这个列表框上,但没有e.ControlKeyEventArgs e ,我从得到的KeyDown。

我不得不解决方案,我想出了这个(它不是最漂亮的一个,但它工作正常):

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();
}


Answer 7:

对我来说,这不是与KeyDown事件工作,所以我PreviewKeyDown试着和它的工作。

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


Answer 8:

如果你想赶上键这样的组合KeyPress Event看这个表在这里:

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

Non-Printing Characters部分,你可以看到每个组合的月数。 例如,对于按Ctrl + C月数为3 。 所以,你可以捕捉它的按键事件是这样的:

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


文章来源: Catching Ctrl + C in a textbox