WinForms ReadOnly TextBox Ctrl-R键向下

时间:2014-10-07 09:40:12

标签: c# .net winforms textbox keyboard-shortcuts

我有一个C#WinForms示例应用程序,演示了有趣的密钥处理问题。 这非常简单:只有FormTextBox。我将TextBox ReadOnly属性设置为true

enter image description here

我的Form中有下一个代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData.HasFlag(Keys.R))
        {
            MessageBox.Show("There is 'R' key in KeyDown event");
        }
    }
}

当我按 Ctrl - R 键时,MessageBox不显示。但是,如果我将ReadOnly的{​​{1}}属性设置为TextBox,则会显示true。当我在MessageBox {上按 Shift - R Alt - R 时,会发生同样的事情{1}}。

enter image description here

任何想法,ReadOnly TextBox Ctrl - R 组合有什么特别之处?

4 个答案:

答案 0 :(得分:3)

TextBoxBase.ProcessCmdKey() method中有一个补丁,它解决了在设置控件的ReadOnly属性时仍然修改文本的某些快捷键的问题。它们是Ctrl + R,Ctrl + J,Ctrl + E和Ctrl + L.

Afaik,这个补丁太粗糙了,它应该只适用于RichTextBox。

通过覆盖TextBox类并恢复这些键的正常行为,可以解决此问题。在项目中添加一个新类并粘贴下面显示的代码。编译。从工具箱顶部删除新控件,替换原始文本框。

using System;
using System.Windows.Forms;

class MyTextBox : TextBox {
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (keyData == (Keys.Control | Keys.R) ||
            keyData == (Keys.Control | Keys.L) ||
            keyData == (Keys.Control | Keys.E) ||
            keyData == (Keys.Control | Keys.J)) return false;
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

答案 1 :(得分:1)

看来这是一个已知问题。你不得不向微软询问它的原因...... http://social.msdn.microsoft.com/Forums/en-US/941c9759-5531-49fe-9ebb-7fc6d812b0fd/ctrle-not-working-in-a-read-only-text-box?forum=csharplanguage

一般建议:如果要检测特定的字符,请使用KeyPress()。在从键盘键转换为字符集后调用它。

private void textBox1_KeyPress(Object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 'R')
        MessageBox.Show("Hit an 'R'");
}

要处理键盘"快捷方式",请更改测试:

if (ModifierKeys == Keys.Control && e.KeyChar == 'R')

答案 2 :(得分:0)

答案 3 :(得分:0)

对于CTRL + R组合

private void KeyDown(object sender, KeyEventArgs e)
{
  if (e.Control && e.KeyCode == Keys.R)
  {
    //your code
  }
}