Как я могу определить, какая горячая клавиша была нажата при использовании RegisterHotKey?

Я делаю программу, в которой мне нужно установить несколько горячих клавиш, которые может нажимать пользователь. Я объявил горячие клавиши следующим образом:

Dim index1 As Integer = 0
    Dim hotkeycounter as integer= 0
    For index0 = 0 To mainArr.GetUpperBound(0)
        For index1 = 0 To mainArr.GetUpperBound(1)
            If mainArr(index0, index1) = "" Then
                MsgBox("exited the unregisterhotkey for loop")
                GoTo line1
            End If
            UnregisterHotKey(Me.Handle, hotkeycounter)
            hotkeycounter = hotkeycounter + 1
        Next
    Next
line1:

    hotkeycounter = 0
    For index0 = 0 To mainArr.GetUpperBound(0)
        For index1 = 0 To index1 = 1
            If mainArr(index0, index1) = "" Then
                MsgBox("exited the registerhotkey for loop")
                GoTo line2
            End If
            RegisterHotKey(Me.Handle, hotkeycounter, &H1, index0)
            hotkeycounter = hotkeycounter + 1
            MsgBox("A hotkey has been registered")
            MsgBox(($"{mainArr(index0, index1)} "))
        Next
    Next
line2:

Таким образом, в основном значения команд для горячей клавиши считываются из массива. Моя проблема в том, что я не могу определить, какой массив нажат (определяется «счетчиком горячих клавиш»). Мой код, чтобы попытаться определить, какая горячая клавиша нажата:

 Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    Dim specialcharacter As String
    If m.Msg = WM_HOTKEY Then   

        If commandID = 0 Then
            MsgBox("You pressed the first key combination")
        ElseIf commandID = 1 Then
            MsgBox("You pressed the second key combination")
        ElseIf commandID = 2 Then
            MsgBox("you pressed the third key combination")
        End If
    End If
        MyBase.WndProc(m)
End Sub

person Dario Killen    schedule 23.06.2018    source источник
comment
Вы должны использовать WParam и LParam из Message, чтобы определить, какая клавиша и модификаторы были нажаты. См. эту тему.   -  person jmcilhinney    schedule 23.06.2018
comment
Хм, но когда я обычно объявляю горячую клавишу [например, выполнив RegisterHotKey(Me.Handle, hotkeycounter, &H1, 65)], я могу ее обнаружить. Вы видите что-то не так с первой частью (той, где я регистрирую горячие клавиши), так как я почти уверен, что проблема должна быть в этой части. Массив объявляется как [Public mainArr(99, 1) As String], где значение команды хранится в первом поле в форме кода символов ascii. Спасибо что нашли время ответить.   -  person Dario Killen    schedule 23.06.2018
comment
Вы читали документацию по функции RegisterHotKey? Это та часть, которая должна вас сейчас заинтересовать: Возвращаемое значение Тип: BOOL Если функция завершается успешно, возвращаемое значение не равно нулю. Если функция завершается ошибкой, возвращаемое значение равно нулю. Чтобы получить расширенную информацию об ошибке, вызовите GetLastError. Функция сообщит вам, успешно она или нет, и вы игнорируете эту информацию.   -  person jmcilhinney    schedule 23.06.2018
comment
Итак, MsgBox(Err.LastDllError) возвращает 0, что, исходя из того, что я прочитал в документации по registerhotkey, означает, что это не удалось. Может у вас не переменная в поле vk[in] функции registerhotkey?   -  person Dario Killen    schedule 23.06.2018
comment
Это неправильный способ проверки ошибок. Объявление pinvoke также неверно. И обработка сообщения неправильная. Здесь несколько ошибок, просто посмотрите на код, который делает это правильно. Понравился код в этом сообщении.   -  person Hans Passant    schedule 23.06.2018