如何使用Windows应用程序在C#中禁用组合框上的快捷键?

如何使用Windows应用程序在C#中禁用组合框上的快捷键?,c#,winforms,combobox,keyboard-shortcuts,C#,Winforms,Combobox,Keyboard Shortcuts,在Main表单中,我使用快捷键(ctrl+S)将数据保存到数据库中。对于组合框(ctrl+字母)是默认操作。如何禁用Combobox的快捷键 更新: 在按键事件中,我们可以这样做 if (ModifierKeys == Keys.Control) { e.Handled = true; } 我觉得你的问题实际上是组合框在你的表单之前被按下了。如果要在控件之前处理按键操作,请确保将窗体的KeyPreview属性设置为true

在Main表单中,我使用快捷键(ctrl+S)将数据保存到数据库中。对于组合框(ctrl+字母)是默认操作。如何禁用Combobox的快捷键

更新:

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

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

我觉得你的问题实际上是组合框在你的表单之前被按下了。如果要在控件之前处理按键操作,请确保将窗体的KeyPreview属性设置为true

有关KeyPreview属性的详细信息:


如果您遇到诸如重写F4键(在组合框中显示默认可用的所有选项)之类的问题,请注意有关将窗体的KeyPress事件处理程序中的KeyPressEventArgs.Handled属性设置为true的部分。

您可以尝试重写主窗体的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);
}
protectedoverride bool ProcessCmdKey(参考消息msg,Keys keyData){
常量int WM_KEYDOWN=0x100;
if(keyData==(Keys.Control | Keys.S)){
如果(msg.msg==WM_KEYDOWN)

MySaveDataToDatabase();//对于大多数热键,您可以覆盖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:
注销热键。
。此处的详细信息:

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

编辑:

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

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

如果(键码>=(int)(键A)&&keyCode在Previewkeydown中没有键属性谢谢,已经修复了它。它应该是
keyCode
而不是
key
。那么对于所有字母表,您如何做到这一点。添加了多个项目的示例。如果您需要所有可能的键,根本不使用键代码测试。如果您需要所有字母或数字作为示例,您将我必须在某个地方声明它们(如上面的例子)。没有(干净的)方法。