Как использовать переменную в операторе виртуального ключа в VB.Net

Я пытаюсь использовать переменную в выражении Virtual-Key в VB.Net, но постоянно получаю ошибки. Каков правильный синтаксис? Без переменной код выглядит так:

<DllImport("user32.dll")> _
Public Shared Sub keybd_event(bVk As Byte, bScan As Byte, dwFlags As UInteger, dwExtraInfo As UInteger)
End Sub

Const VK_1 As Integer = &H31

keybd_event(VK_1, 0, 0, 0) 
keybd_event(VK_1, 0, KEYEVENTF_KEYUP, 0)

Я пытаюсь сделать:

keybd_event(digit, 0, 0, 0)
keybd_event(digit, 0, KEYEVENTF_KEYUP, 0)

где "цифра" - переменная. Я пробовал:

Dim digit as Byte = "VK_" & 1

Dim digit as Integer = "VK_" & 1

Dim digit as String = "VK_" & 1

Но я получаю сообщение об ошибке: «Преобразование из строки «VK_1» в тип «Byte» недопустимо». и «Преобразование строки «VK_1» в тип «Целое число» недопустимо».

Я пробовал:

keybd_event(VK_digit, 0, 0, 0)

Но получил ошибку "VK_digit не объявлен. Он может быть недоступен из-за его уровня защиты".

Я также пытался преобразовать жало в байты и использовать Integer.Parse в строке, но это также вызвало ошибки.


person user3080392    schedule 12.07.2016    source источник


Ответы (1)


Имена переменных не могут быть объединены. Боюсь, то, что вы сейчас пытаетесь сделать с переменной digit, невозможно. Вы получаете ошибки, потому что в своих попытках вы просто берете обычную строку и пытаетесь преобразовать ее в число (что не работает, поскольку, например, "VK_1" содержит буквы и другие нечисловые символы).

Однако, если вы хотите динамически указать цифровую клавишу, есть несколько способов.

Для начала: все коды клавиш VK_ можно найти в System.Windows.Forms.Keys перечисление, поэтому вам не нужно искать каждый ключ, который вы хотите использовать.

Во-вторых: коды клавиш чисел следуют друг за другом. Номер 0 имеет код ключа 48, номер 1 имеет код ключа 49, номер 2 имеет код 50 и так далее...

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

Простое решение:

Dim digit As Integer = 3 'Cannot go below 0 nor above 9.

keybd_event(Keys.D0 + digit, 0, 0, 0)
keybd_event(Keys.D0 + digit, 0, KEYEVENTF_KEYUP, 0)

Второе, более сложное решение — преобразовать строку в значение перечисления:

Dim digit As Integer = 3
Dim Key As Keys = [Enum].Parse(GetType(Keys), "D" & digit, True)

keybd_event(Key, 0, 0, 0)
keybd_event(Key, 0, KEYEVENTF_KEYUP, 0)

Преимущество второго решения в том, что оно работает не только с числами:

Dim Letter As String = "F"
Dim Key As Keys = [Enum].Parse(GetType(Keys), Letter, True)

keybd_event(Key, 0, 0, 0) 'Presses "F".
keybd_event(Key, 0, KEYEVENTF_KEYUP, 0)
person Visual Vincent    schedule 13.07.2016
comment
Большое спасибо! Оба ваших решения хорошо работают для меня. Я бы никогда не понял этого. - person user3080392; 13.07.2016
comment
@ user3080392: Рад помочь! Второй метод анализирует строки в перечислении ключей, что означает, что вы можете использовать его, пока вы пишете правильное имя для одного из ключей. Например, "ControlKey" будет преобразовано в Keys.ControlKey, и, поскольку не имеет значения, используете ли вы буквы верхнего или нижнего регистра (указывается параметром, установленным в настоящее время на True), вы можете использовать любой вид регистра. Например, "conTRolKEy" тоже подойдет. - person Visual Vincent; 13.07.2016