Я знаю о проблеме здесь, потому что я делал нечто похожее в прошлом и в итоге использовал массив PictureBoxes
вместо графического CommandButtons
.
В любом случае, простой обходной путь с CommandButtons
предназначен для удержания фокуса, добавив к Form
еще один элемент управления, который может действовать как цель фокусировки.Помните: когда активируется Form
, он помещает фокус на первый фокусируемый элемент управления внутри себя.
Поскольку вы не указали в своем вопросе, какое состояние клавиатуры вам нужно, ниже приведен простойПример с клавишами a s d f .Вам потребуется менее 5 минут, чтобы запустить его.
Шаг 0:
Скопируйте и вставьте следующие объявления в Ваш VB Form
:
Option Explicit
Option Base 0
Const BM_SETSTATE = &HF3
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim Target(254) As Long
Шаг 1:
Добавьте в Ваш Form
массив CommandButtons
, например, Button (0) , Кнопка (1) , Кнопка (2) , Кнопка (3) и т. Д.Установите нужные вам свойства (Picture, DownPicture и т. Д.), А также установите:
TabStop: False
Дважды щелкните один из этих CommandButtons
.Вы можете видеть, у вас есть только одна точка входа для всего массива элементов управления.Выберите GotFocus
из выпадающего списка событий и поместите этот фрагмент кода:
Private Sub Button_GotFocus(Index As Integer)
PicFocus.SetFocus
End Sub
Шаг 2:
На вашем VB Form
, установите этосвойство:
KeyPreview: True
Дважды щелкните Form
, выберите Load
в раскрывающемся списке событий и установите желаемое отображение между KeyCode
и соответствующим CommandButton
:
Private Sub Form_Load()
Target(65) = Button(0).hwnd ' 65: KeyCode for "a"
Target(83) = Button(1).hwnd ' 83: KeyCode for "s"
Target(68) = Button(2).hwnd ' 68: KeyCode for "d"
Target(70) = Button(3).hwnd ' 70: KeyCode for "f"
End Sub
Выберите KeyDown
и KeyUp
из раскрывающегося списка событий и поместите в два глобальных обработчика событий клавиатуры этот фрагмент кода - соответственно -1 для состояния пониженного уровня и 0 для состояния повышенного уровня:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
' Debug.Print KeyCode
Call PostMessage(Target(KeyCode), BM_SETSTATE, -1&, 0&)
End Sub
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
Call PostMessage(Target(KeyCode), BM_SETSTATE, 0&, 0&)
End Sub
Шаг 3:
Наконец, добавьте к тому же VB Form
PictureBox
, упомянутому выше, и установите следующие свойства:
Name: PicFocus
Appearance: 0-Flat
BorderStyle: 0-None
HasDC: False
TabIndex: 0
TabStop: False
Width: 255
Left: -1000
Нажмите Ctrl + F5 и проверьте, что вам нужно.