【发布时间】:2016-03-10 10:59:31
【问题描述】:
我正在尝试检测 TextBox 中的 Tab 按键。
我知道 Tab 键不会触发 KeyDown、KeyUp 或 KeyPress 事件。我发现:Detecting the Tab Key in Windows Forms of BlackWasp in internet。
他们建议覆盖我所做的 ProcessCmdKey,但它也没有被触发。
是否有可靠的方法来检测 Tab 键按下?
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
bool baseResult = base.ProcessCmdKey(ref msg, keyData);
if (keyData == Keys.Tab && textBox_AllUserInput.Focused)
{
MessageBox.Show("Tab key pressed.");
return true;
}
if (keyData == (Keys.Tab | Keys.Shift) && textBox_AllUserInput.Focused)
{
MessageBox.Show("Shift-Tab key pressed.");
return true;
}
return baseResult;
}
根据 Cody Gray 的建议,我将代码修改如下:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == Keys.Tab && textBox_AllUserInput.Focused)
{
MessageBox.Show("Tab key pressed."); }
if (keyData == (Keys.Tab | Keys.Shift) && textBox_AllUserInput.Focused)
{
MessageBox.Show("Shift-Tab key pressed."); }
return base.ProcessCmdKey(ref msg, keyData);
}
问题是它没有捕捉到 Tab 键的按下。
【问题讨论】:
-
是的,ProcessCmdKey() 非常可靠。没人知道你是怎么弄的。
-
我的代码是:protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { bool baseResult = base.ProcessCmdKey(ref msg, keyData); if (keyData == Keys.Tab && textBox_AllUserInput.Focused) { MessageBox.Show("Tab 键被按下。");返回真; } 返回基本结果;我尝试了所有 3 个答案,但没有一个有效。
-
如果要覆盖它,请不要调用基本实现。将
base.ProcessCmdKey(...)移动到函数的末尾。 -
当你想处理
TextBox的Tab键时,你可以简单地处理PreviewKeyDown事件,当然你不需要覆盖ProcessCmdKey并检查什么是焦点控件! -
Cody Gray,很抱歉,我还没有那么精通 C#。我不知道如何:子类 TextBox 并覆盖 IsInputKey。