繁体   English   中英

WinForms ReadOnly TextBox按下Ctrl-R键

[英]WinForms ReadOnly TextBox Ctrl-R key down

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

在此处输入图片说明

我的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不会显示。 但是,如果我将TextBox ReadOnly属性设置为true ,则会显示MessageBox 当我在ReadOnly TextBox上按Shift - RAlt - R时ReadOnly发生同样的事情。

在此处输入图片说明

有什么想法, ReadOnly TextBoxCtrl - R组合有什么特别之处?

TextBoxBase.ProcessCmdKey()方法中有一个修补程序,它解决了在设置控件的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);
    }
}

看来这是一个已知问题。 您必须向Microsoft询问其原因... http://social.msdn.microsoft.com/Forums/zh-CN/941c9759-5531-49fe-9ebb-7fc6d812b0fd/ctrle-not-working-in -a-只读文本框?论坛= 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')

对于CTRL + R组合

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

暂无
暂无

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

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