当用户在windows窗体文本框中键入KeyUp事件时,windows发出哔哔声或ding。我不知道为什么会发生这种情况,也不知道如何避免。
消除声音的实际解决方案:
private void TextBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
}
}
我认为这是由以下因素组合造成的:
-
MultiLine = false
表单上没有默认按钮
,因为单行文本框将输入键转发给默认按钮。当无法找到默认按钮时,会生成此ding。
实际答案如下:
Private Sub myTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles myTextBox.KeyPress
If Asc(e.KeyChar) = 13 Then
e.Handled = True
End If
End Sub
这吃了按键,防止叮。
经过几个小时的挖掘解决方案,我只是得到了一个变通方法,但不是这个问题的真正解决方案。现在我使用KeyDown来代替。
private void tbSearch_KeyDown( object sender, KeyEventArgs e )
{
if ( e.KeyCode == Keys.Enter )
{
e.Handled = true;
// Call Button event
//btnSearch_Click( sender, EventArgs.Empty );
// cleaner code. Thanks to Hans.
btnSearch.PerformClick();
}
}
给所有开发者一个有用的建议:不要用静音测试你的应用程序。: -)
以上解决方案都不能满足我的需求。但这是我的简单解决方案!
只有当你不再需要在应用程序中使用Acceptbutton时,它才会起作用。
private void txtPassword_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter) { cmdLogin.PerformClick(); }
}
private void txtPassword_Enter(object sender, EventArgs e)
{
this.Acceptbutton = this.cmdLogin;
}
private void txtPassword_Leave(object sender, EventArgs e)
{
this.Acceptbutton = Null;
}
这样,当按下"Enter"时,您将不会听到特定文本框上的ping。
当用户从单行文本框中按enter键时,当我从自定义控件调用myDialog.ShowDialog()时,会发生这个问题的一个版本。
(他们在文本框中输入产品编号,按回车键,然后弹出对话框,让他们从可用的尺寸中选择。但如果每次对话框弹出时都播放铃声,那就太烦人了。
我在文本框中捕获了按下键事件,并设置了e.Handled和e.suppresskeypress,但这并没有解决问题。然后我注意到,如果我注释掉对myDialog.ShowDialog()的调用,那么我就没有得到声音,这很奇怪。在这种情况下,e.Handled和e.SupressKeypress确实阻止了铃声。
我想也许事件以某种方式传递给了对话框,所以我在表单级别和表单的每个元素上捕获了keydown事件,并在每个元素中设置了e.Handled和e.SuppressKeypress,但这并没有修复它。
我尝试在表单上放置一个提交按钮,并将表单的AcceptButton属性设置为该按钮,但这也没有帮助。
在调用myDialog.ShowDialog()之前,我尝试调用Application.DoEvents(),但这并没有解决它。
我注意到调用Application.DoEvents()导致铃声播放,即使调用myDialog.ShowDialog()被注释掉!就好像调用DoEvents是在处理当前事件而不注意e.Handled和e.suppresskeypress限定符。
. .我想,如果我让当前事件在限定词播放时结束,然后在之后弹出对话框会怎么样?
所以我把myDialog.ShowDialog()放入BeginInvoke部分(因为我的印象是调用将消息添加到主消息队列中,导致该方法在处理该消息时被调用):
BeginInvoke((MethodInvoker)delegate {
SelectProduct(); // <-- pops the size selection dialog
});
信不信由你,这就解决了——没有铃声。
(当后台线程调用回调时需要更新视图时,我通常使用调用,因为WinForms视图不允许自己从主线程以外的线程更新。)
所以我猜自定义控件,单行文本框所在的地方,是需要接受按钮的地方-但自定义控件没有AcceptButton属性。
WinForms编程似乎有点像黑艺术。我想就像其他类型的编程一样。