I used KeyDown event and some simple code like if (e.KeyCode == Keys.F1)
to capture F1 is pressed on a form BUT if there are some text boxes on the form or if there are some spreadsheets with Dock Fill on the form then the code above gets useless and does nothing. But I want to do something when user presses F1 on this form. so how do we capture a specific keydown event like F1 on the whole form..and I do not want to go to the route that capture the KeyDown of all other controls on the form and pass them to the Form for processing. is there any cleaner way to do this?
相关问题
- Sorting 3 numbers without branching [closed]
- Graphics.DrawImage() - Throws out of memory except
- Generic Generics in Managed C++
- Why am I getting UnauthorizedAccessException on th
- 求获取指定qq 资料的方法
Turn on
KeyPreview
and every key press in the form will get routed through it's key event handlers first.Yes, indeed there is. The correct way for the form to handle key events regardless of the control that currently has the input focus is to override the
ProcessCmdKey
method of your form class:You return
true
to indicate that you handled the keystroke and don't want it to be passed on to other controls. If you do want it to be passed on to the event handlers for other controls, simply returnfalse
.And you're best off ignoring the
KeyPreview
property. That's an anachronism from the VB 6 days and not really the preferred way of doing this in the .NET world. Further reading: Disadvantage of setting Form.KeyPreview = true?Another way is to Override the ProcessCmdKey function http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=VS.100).aspx
Set the form's
KeyPreview
to true. This will make sure the form get the keypress messages first and if you handle it, you can sete.Handled = true
so it doesn't passed down to the controls.