在文本框中捕获Ctrl + C.

时间:2009-10-30 15:53:36

标签: c# winforms textbox

尽管我多年来一直在使用C#(Windows Forms),但我有一个大脑失败的时刻,并且不能为我的生活找出如何抓住用户输入 Ctrl + C 进入文本框。

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

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

如果我抓住keydown,当用户按 Ctrl 时(即,在他们点击 C 键之前),事件将触发。

我很遗憾,这可能是一件非常简单的事。

8 个答案:

答案 0 :(得分:34)

继续使用KeyDown事件,但在那个事件中检查 Ctrl C ,如下所示:

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

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

答案 1 :(得分:6)

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

  1. 的KeyDown
  2. 按键响应
  3. KEYUP
  4. KeyPress事件不是由非字符键引发的;但是,非字符键确实引发了KeyDown和KeyUp事件。 控制是一个非特征键。

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

答案 2 :(得分:6)

我在TextBoxKeyDown抓取 Ctrl + C 时遇到问题。当ControlControl都被按下时,我只获得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();
    }
}

答案 3 :(得分:3)

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

答案 4 :(得分:1)

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

修改即可。哎哟......周杰伦的回答肯定更好。 : - )

答案 5 :(得分:1)

我不知道是不是因为新版本有些变化,或者因为我试图在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();
}

答案 6 :(得分:0)

对我来说,它没有使用KeyDown事件,所以我尝试使用PreviewKeyDown并且它已经工作了。

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

答案 7 :(得分:0)

如果您想在print([c + " " + h in zip(cast, heights)]) 中捕捉到这样的按键组合,请在此处查看此表:

  

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

KeyPress Event部分中,您可以看到每种组合的Dec数字。 例如, Ctrl + C 的Dec编号为Non-Printing Characters。因此,您可以像这样在KeyPress事件中捕获它:

3