问题
Any ideas how to stop the system bell from sounding when CTRL-A is used to select text in a Winforms application?
Here's the problem. Create a Winforms project. Place a text box on the form and add the following event handler on the form to allow CTRL-A to select all the text in the textbox (no matter which control has the focus).
void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.A && e.Modifiers == Keys.Control)
{
System.Diagnostics.Debug.WriteLine("Control and A were pressed.");
txtContent.SelectionStart = 0;
txtContent.SelectionLength = txtContent.Text.Length;
txtContent.Focus();
e.Handled = true;
}
}
It works, but despite e.Handled = true, the system bell will sound every time CTRL-A is pressed.
Thanks for the reply.
KeyPreview on the Form is set to true - but that doesn't stop the system bell from sounding - which is the problem I'm trying to solve - annoying.
回答1:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.A)
{
this.textBox1.SelectAll();
e.SuppressKeyPress = true;
}
}
hope this helps
回答2:
Thanks to an MSDN Forum post - this problem only occurs when textboxes are in multiline mode and you'd like to implement Ctrl+A for select all.
Here's the solution
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
if (keyData == (Keys.A | Keys.Control)) {
txtContent.SelectionStart = 0;
txtContent.SelectionLength = txtContent.Text.Length;
txtContent.Focus();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
回答3:
This worked for me:
Set the KeyPreview on the Form to True.
Hope that helps.
回答4:
@H7O solution is good, but I improved it a bit for multiply TextBox components on the form.
private void textBox_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.A)
{
((TextBox)sender).SelectAll();
e.SuppressKeyPress = true;
}
}
来源:https://stackoverflow.com/questions/225711/stop-the-bell-on-ctrl-a-winforms