如何使用Windows应用程序在C#中禁用ComboBox上的短键?

时间:2013-07-10 05:24:33

标签: c# winforms combobox keyboard-shortcuts

在主窗体中,我有快捷键(ctrl + S),用于在DataBase中保存数据。对于组合框(ctrl + Alphabets)是默认操作。如何禁用Combobox的快捷键?

更新:

在keyPress事件中,我们可以这样做

        if (ModifierKeys == Keys.Control)
        {
            e.Handled = true;
        }

3 个答案:

答案 0 :(得分:2)

您可以尝试重写主窗体的ProcessCmdKey方法:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
  const int WM_KEYDOWN = 0x100; 

  if (keyData == (Keys.Control | Keys.S)) {
    if (msg.Msg == WM_KEYDOWN)
      MySaveDataToDatabase(); // <- Do your save command

    return true; // <- Stop processing the WM_KeyDown message for Ctrl + S (and shortcut as well)
  }

  // All other key messages process as usual
  return base.ProcessCmdKey(ref msg, keyData);
}

答案 1 :(得分:0)

我觉得你的问题实际上是组合框在你的表格之前获得了按键。如果要在控件之前处理按键,请务必将Form的KeyPreview属性设置为true。

有关KeyPreview属性的更多信息: http://msdn.microsoft.com/en-us/library/system.windows.forms.form.keypreview(v=vs.100).aspx

如果您遇到覆盖F4键的问题(在组合框中显示默认情况下所有可用选项),请注意将表单的KeyPress事件处理程序中的KeyPressEventArgs.Handled属性设置为true。

答案 2 :(得分:0)

对于大多数热键,您可以覆盖PreviewKeyDown事件,指定允许或不允许的内容,例如:

void comboBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
   var keysToIgnore = new []{
       Keys.S,
       Keys.X,
       Keys.F4,
       Keys.Space,
   }.ToList();

   if (keysToIgnore.Contains(e.KeyCode)) {
      if(e.Modifiers == Keys.Alt) ; // Do stuff (or don't) here
   }
}

根据您的实际使用情况,您可以通过各种方式构建逻辑,但希望您能够理解。

您可能会发现某些热键组合无法以此方式禁用,在这种情况下,您需要使用Win32API:UnregisterHotKey。更多信息:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646327%28v=vs.85%29.aspx

使用PreviewKeyDown事件的主要优点是您还可以轻松替换行为,而不仅仅是禁用它。使用UnregisterHotKey的主要优点是它在较低级别运行,是一种更加健壮和可靠的禁用热键的方法。

编辑:

如果您需要获得连续的值范围,可以尝试以下方法:

int keyCode = (int) (e.KeyCode);
if(keyCode >= (int)(Keys.A) && keyCode <= (int)(Keys.Z)) { /* do stuff */ } 

但同样,理想的解决方案实际上取决于您的用例的具体情况。没有通用的'正确答案'。