【问题标题】:Catching Ctrl + C in a textbox在文本框中捕获 Ctrl + C
【发布时间】:2009-10-30 15:53:36
【问题描述】:

尽管我多年来一直在使用 C# (Windows Forms),但我的大脑一直处于崩溃状态,我终其一生都无法弄清楚如何捕捉用户键入 Ctrl + C 进入文本框。

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

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

如果我捕捉到 keydown,事件会在用户按下 Ctrl 时触发(也就是说,在他们按下 C 键之前)。

这可能是我想念的简单得愚蠢的东西。

【问题讨论】:

    标签: c# winforms textbox


    【解决方案1】:

    继续使用 KeyDown 事件,但在该事件中检查 both CtrlC,如下所示:

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

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

    【讨论】:

    • 接受,因为这是第一个工作响应。非常感谢。 - 我确实最终弄明白了 - 看看我自己的答案。
    • 我知道,已经有一段时间了,但是对于那些将来会发现的人: Shift-Insert 仍然被处理,所以你需要添加 (e.Shift && e.KeyCode == Keys .Insert) 验证。此外,用户仍然可以右键单击该字段并选择粘贴...所以不是 100% 证明。
    【解决方案2】:

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

    1. 按键
    2. 按键
    3. KeyUp

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

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

    【讨论】:

      【解决方案3】:

      我在TextBox by KeyDown 上捕捉 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();
          }
      }
      

      【讨论】:

      • 不正确,KeyUp 事件捕获是正确的解决方案。
      【解决方案4】:

      天啊!刚刚想通了。在三种可能的事件中,我没有尝试过的就是我需要的! 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 对我不起作用,因为我使用断点来捕获事件。不过它在 KeyUp 上运行良好,因此我决定参加这个活动。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          如果您想在KeyPress Event 中捕获此类键组合,请在此处查看此表:

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

          Non-Printing Characters 部分,您可以查看每个组合的十二月数字。 例如,Ctrl + C 的十进制数是 3。所以你可以像这样在 KeyPress 事件中捕获它:

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

          【讨论】:

            【解决方案8】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-01-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-11-22
              • 2012-06-14
              • 1970-01-01
              相关资源
              最近更新 更多