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