[英]WinForms ReadOnly TextBox Ctrl-R key down
我有一个C#WinForms示例应用程序,演示了有趣的密钥处理问题。 这很简单:上面只有一个Form
和TextBox
。 我将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 - R或Alt - R时 , ReadOnly
发生同样的事情。
有什么想法, ReadOnly
TextBox
和Ctrl - 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')
您可能会查看ShortCutsEnabled属性。
对于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.