PRB: Arrow Keys Do Not Always Produce a KeyDown Event

ID: Q138530


The information in this article applies to:
  • Microsoft Visual Basic Standard, Professional, and Enterprise Editions for Windows, version 4.0
  • Microsoft Visual Basic Professional Edition for Windows, version 3.0


SYMPTOMS

The KeyDown event for a form is not invoked when using the arrow (navigational) keys, even though the Keypreview property is set to True for the form. Instead the arrow keys cause other controls to gain the focus, even if the TabStop property is set to False for those controls.

NOTE: The DEL key may not trigger the KeyDown event either. For instance, in Visual Basic 4.0 the DEL key in a masked edit box does not trigger the KeyDown event.


RESOLUTION

You can get around this behavior by placing the problem controls onto a container that has a trappable KeyDown event. This would include the TabStrip, SSTab, PictureBox, and so forth. The following example uses a PictureBox because it is easily made unnoticeable.

Steps to Work Around Behavior

  1. Create a new project in Visual Basic. Form1 is created by default.


  2. Set the KeyPreview property to True for Form1.


  3. Add a PictureBox to Form1 and set the following properties:


  4. 
    TabStop 	False
    BorderStyle	0 - None
    BackColor	Same as From (by default) 
  5. Add three CommandButtons to Picture1.


  6. Set the Tabstop property of each CommandButton to False.


  7. Add the following code to the code window of Form1:


  8. 
          Private Sub Command5_Click()
          'some code here
              Picture1.SetFocus
          End Sub
    
          Private Sub Command6_Click()
          'some code here
              Picture1.SetFocus
          End Sub
    
          Private Sub Command7_Click()
          'some code here
              Picture1.SetFocus
          End Sub
    
          Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
              Debug.Print "Form_KeyDown - " & KeyCode
          End Sub
    
          Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer)
              Debug.Print "Picture1_KeyDown - " & KeyCode
          End Sub 
  9. Run the program by pressing the F5 key. Note that the PictureBox is unnoticeable.


  10. Pressing an arrow key activates the KeyDown event of the PictureBox and of the form. You can now use either Event to trap the Arrow keys.


STATUS

Microsoft is researching this behavior and will post new information here in the Microsoft Knowledge Base as it becomes available.


MORE INFORMATION

Whether or not the form receives a KeyDown event depends on the type of control that has the focus when the arrow key is pressed. The KeyDown event of the form will be correctly activated if the arrow keys are used when a control such as a text box, a list box, or a picture box has the focus. The KeyDown event for the form is not activated when Command buttons, check boxes, and option buttons have the focus when an arrow key is pressed. In all cases, this behavior does not depend on whether Tabstop is set to True or False for the control.

Steps to Reproduce Behavior

  1. Create a new project in Visual Basic. Form1 is created by default.


  2. Set the KeyPreview property to True for Form1.


  3. Add two Command buttons to Form1.


  4. Set the Tabstop property of both Command buttons to False.


  5. Add a DoEvents statement to the Form_KeyDown procedure. Set a breakpoint on the line by highlighting DoEvents and pressing the F9 key.


  6. Run the program by pressing the F5 key. Pressing an arrow key does not activate the KeyDown event of the form.


Additional query words:

Keywords : kbVBp300 kbVBp400 kbGrpVB kbDSupport
Version : WINDOWS:3.0,4.0
Platform : WINDOWS
Issue type : kbprb


Last Reviewed: July 27, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.