我有一个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
不显示。但是,如果我将ReadOnly
的{{1}}属性设置为TextBox
,则会显示true
。当我在MessageBox
{上按 Shift - R 或 Alt - R 时,会发生同样的事情{1}}。
任何想法,ReadOnly
TextBox
和 Ctrl - R 组合有什么特别之处?
答案 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)
您可以查看ShortCutsEnabled属性。
正如此帖所见:Why are some textboxes not accepting Control + A shortcut to select all by default
答案 3 :(得分:0)
对于CTRL + R组合
private void KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.R)
{
//your code
}
}