我正在寻找一种方法来在控制焦点时取消键盘快捷键或命令键(如F1或CTRL + O)的击键。如果可能,在控制级别。
想象一下,我在表单上托管了一个控件(例如一个简单的文本框)。我为Open(CTRL + O)或Help(F1)等命令设置了键盘快捷键。如果控件具有键盘焦点,我按下其中一个命令,以防止执行快捷命令。
我更喜欢一种解决方案,我可以处理这些击键并防止它们在控件级而不是在表单级别“冒泡”。
答案 0 :(得分:2)
您可以使用KeyDown事件:
void DropDownBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
switch (e.KeyCode)
{
case Keys.Down:
case Keys.Up:
ShowPopup();
e.SuppressKeyDown = true; // Don't pass it to the underlying control
break;
}
}
如果这还不够 - 例如重写Tab或任何其他基本击键,这是一个 very good article about keyhandling
答案 1 :(得分:2)
我发现的唯一解决方案是在控件级别实现/覆盖ProcessCmdKey函数:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData >= Keys.F1 && keyData <= Keys.F24)
{
WndProc(ref msg);
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
我还需要从mainform中删除所有键盘快捷键,并以相同的方式处理它们。
答案 2 :(得分:1)
在keydown事件中使用e.SuppressKeyPress = true;
:我已将复选框的访问密钥设为ALT + C并且运行良好。
private void cboViewType_KeyDown(object sender, KeyEventArgs e)
{
if ((Control.ModifierKeys & Keys.Control) == Keys.Control || e.KeyCode == Keys.F1 || ((Control.ModifierKeys & Keys.Alt) == Keys.Alt && e.KeyCode == Keys.C))
{
// do whatever you want to do here...
MessageBox.Show("key overridden");
e.SuppressKeyPress = true;
}
//e.Handled = true; // will not work for overriding the shortcut etc.
}
答案 3 :(得分:0)
您可以通过在任何可聚焦控件的KeyEventArgs.Handled = true
事件处理程序中设置KeyDown
来停止大多数键盘事件的“冒泡”。
它拦截ALT-F4或F1,但不会拦截系统组合,如ALT-TAB。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
e.Handled = true;
}
}