为什么按Ctrl +“+”会在TextBox中产生哔声?

我正在使用C#Windows Forms并希望使用Ctrl+"Oemplus"作为我的应用程序的functionkey 。 我使用German keyboard ,这个键位于字母P右侧的2个键(即“+”)。 每当我与Ctrl结合使用此键并且焦点位于TextBox我会发出一声哔哔声。
当我切换到US keyboard布局(仍使用我的German keyboard )时也会发生这种情况。 这是] key
Internet Explorers地址栏中按此键时也会发生同样的情况。 我的问题是:

  1. 为什么此组合键会在TextBox中产生哔声。
  2. 我怎能避免发出哔哔声?

感谢您为此付出的任何努力。
更新:
我在美国/泰国键盘上试了一下,也发出了哔哔声。 无论我使用什么逻辑键盘布局(德语,美国,泰国),都会发生这种情况。
蜂鸣声也发生在地址栏中的Windows资源管理器中,但不会出现在搜索框中。

我认为发生的是文本框不允许组合键,因此您收到错误。 您可以通过此代码测试密钥组合(使用EN Windows中的右括号键),它使用SuppressKeyPress来防止密钥组合被传递到底层控件以防止发出蜂鸣声。

 private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (ModifierKeys == Keys.Control) if (e.KeyValue == 221) // You may need to determine this value for your keyboard layout. { textBox1.Text += " + "; // Handle the Key combination. e.SuppressKeyPress = true; // Prevents key from being passed to underlying control } } 

当你按下那个按键时,你很希望发生什么。 TextBox对它毫无疑问,它是BEEP! 因为它可以看到用户正在尝试做一些特别的事情,但它并不确切知道是什么 。 发牢骚的好理由。 解决方案是在下一个片段的// ..注释中实现魔术。 使用额外的代码来结束最后的哔声:

  private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == (Keys.Control | Keys.Oemplus)) { // Invoke magic //... // Magic is done now: e.Handled = e.SuppressKeyPress = true; } } 

过了一段时间,我回来了。 我发现对以前的解决方案不满意的是,每个TextBox都需要处理我用于其他东西的每个“哔哔”键。 当然,我可以inheritanceTextBox但仍然有两个地方可以改变这个行为的每个键(处理和蜂鸣声抑制)。

实际上我使用Ctrl +’+’作为命令键。 我使用全局键盘钩子执行此操作,因为该操作应该可用并影响所有表单。 相反,我现在使用以下代码以基本forms处理此问题:

  // Avoid beep on Ctrl+'+' in TextBox. protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { Keys key = keyData & Keys.KeyCode; bool alt = keyData.HasFlag(Keys.Alt); bool shift = keyData.HasFlag(Keys.Shift); bool control = keyData.HasFlag(Keys.Control); if (key == Keys.Oemplus && !shift && control && !alt) { // Perform the action for Ctrl+'+' return true; } return base.ProcessCmdKey(ref msg, keyData); } 

对我来说,这似乎是“正确”的位置和处理命令键的方式。 蜂鸣声消失了,没有任何额外的处理,我不必担心额外的命令键是否会发出蜂鸣声。

当表单有菜单或工具栏时,这将由为菜单项定义的快捷方式自动处理。 但我的表单没有菜单或工具栏。