Trucos Distinguir entre las dos teclas Enter

Artículo Q188550

Cuando usas la constante vbKeySeparator para evaluar las pulsaciones de teclas en los eventos KeyUp, KeyDown o KeyPress y distinguir el Enter del teclado alfabético y el Intro del numérico las comparaciones siempre devuelven falso debido a un bug (del VB 4, 5 y 6 !!).

Para resolverlo :

Declaramos en el formulario :
Private Declare Function PeekMessage Lib "user32" Alias _
        "PeekMessageA" (lpMsg As MSG, ByVal hwnd As Long, _
        ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, _
        ByVal wRemoveMsg As Long) As Long

Private Type POINTAPI
  x As Long
  y As Long
End Type

Private Type MSG
   hwnd As Long
   message As Long
   wParam As Long
   lParam As Long
   time As Long
   pt As POINTAPI
End Type

Const PM_NOREMOVE = &H0
Const WM_KEYDOWN = &H100
Const WM_KEYUP = &H101
Const VK_RETURN = &HD

Y en el evento :

Dim MyMsg As MSG, RetVal As Long

' se le pasa:
' estructura MSG para recibir la información del mensaje
' handle de la ventana
' filtros superior e inferior a 0 para recibir todos los mensajes
' PM_NOREMOVE para dejar las pulsaciones en la cola de mensajes
' usa PM_REMOVE (1) para eliminarlas
RetVal = PeekMessage(MyMsg, Me.hwnd, 0, 0, PM_NOREMOVE)

' ahora comparamos el MSG.wParam con VK_RETURN
' si la pulsación fue esta, miramos el bit 24 del lparam. Si está ON se usó el
' teclado numérico, si no el alfabético.
If RetVal <> 0 Then
   If MyMsg.wParam = VK_RETURN Then
      If MyMsg.lParam And &H1000000 Then
         MsgBox "Enter del teclado numérico"
      Else
         MsgBox "Enter del teclado alfabético"
      End If
   End If
Else
   MsgBox "No había mensajes en la cola o a habido problemas con
PeekMessage"
End If



Trucos Trucos

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com