繁体   English   中英

在文本框中捕获Ctrl + C.

[英]Catching Ctrl + C in a textbox

尽管我多年来一直使用C#( Windows Forms ),但我有一个大脑失败的时刻,并且在我的生活中无法弄清楚如何捕获用户在文本框中键入Ctrl + C。

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

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

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

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

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

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

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

我在使用KeyDownTextBox上捕获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();
    }
}

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

  1. 的KeyDown
  2. 按键
  3. KEYUP

非字符键不会引发KeyPress事件; 但是,非字符键确实引发了KeyDown和KeyUp事件。 控制是一个非字符键。

你可以检查这行代码: if (e.KeyData == (Keys.Control | Keys.C))

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

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

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

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

如果你想在KeyPress Event捕获这样的键组合,请在此处查看此表:

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

在“ Non-Printing Characters部分中,您可以看到每个组合的Dec编号。 例如, Ctrl + C的 Dec编号为3 所以你可以在KeyPress事件中捕获它,如下所示:

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

对我来说,它不能使用KeyDown事件,所以我尝试使用PreviewKeyDown并且它有效。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM