Различать клавиши ввода в событии нажатия

Вы можете обнаружить клавишу ввода, если она нажата в VB.net, используя обработчик Keydown:

Private Sub kd(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
     IF e.key=key.Enter Then
       <do your code>
     Endif
End Sub

Однако есть ли способ узнать, какая из двух клавиш ввода на клавиатуре была нажата? Поскольку у вас есть две клавиши ввода на клавиатуре (одна рядом с апострофом (в центре) и одна на цифровой клавиатуре), я хочу, чтобы средняя кнопка ввода имела ответ, отличный от кнопки ввода с цифровой клавиатуры.

пример: в фотошопе при использовании инструмента "Текст" можно нажать среднюю клавишу ввода, чтобы добавить еще одну строку текста, или клавишу ввода с цифрой, чтобы подтвердить введенный текст.

1 ответ

Взято с http://support.microsoft.com/kb/188550/en-us

Код в VB.net

Option Strict Off
Option Explicit On
Friend Class Form1
    Inherits System.Windows.Forms.Form
    Private Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (ByRef lpMsg As MSG, ByVal hwnd As Integer, ByVal wMsgFilterMin As Integer, ByVal wMsgFilterMax As Integer, ByVal wRemoveMsg As Integer) As Integer

    Private Structure POINTAPI
        Dim x As Integer
        Dim y As Integer
    End Structure

    Private Structure MSG
        Dim hwnd As Integer
        Dim message As Integer
        Dim wParam As Integer
        Dim lParam As Integer
        Dim time As Integer
        Dim pt As POINTAPI
    End Structure

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

    Private Sub Form1_KeyDown(ByVal eventSender As System.Object, ByVal eventArgs As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
        Dim KeyCode As Short = eventArgs.KeyCode
        Dim Shift As Short = eventArgs.KeyData \ &H10000
        Dim MyMsg As MSG
        Dim RetVal As Integer

        ' pass:
        '   MSG structure to receive message information
        '   my window handle
        '   low and high filter of 0, 0 to trap all messages
        '   PM_NOREMOVE to leave the keystroke in the message queue
        '   use PM_REMOVE (1) to remove it
        RetVal = PeekMessage(MyMsg, Me.Handle.ToInt32, 0, 0, PM_NOREMOVE)

        ' now, per Q77550, you should look for a MSG.wParam of VK_RETURN
        ' if this was the keystroke, then test bit 24 of the lparam - if ON,
        ' then keypad was used, otherwise, keyboard was used
        If RetVal <> 0 Then
            If MyMsg.wParam = VK_RETURN Then
                If MyMsg.lParam And &H1000000 Then
                    MsgBox("Enter from Keypad pressed")
                Else
                    MsgBox("Enter from Keyboard pressed")
                End If
            End If
        Else
            MsgBox("No message waiting, or possible problems calling PeekMessage")
        End If
    End Sub
End Class
Другие вопросы по тегам