VB6 подавить нажатия клавиш с помощью API? (делает горячую клавишу) - PullRequest
1 голос
/ 12 апреля 2020

Я искал и не могу найти ответ, поэтому любая помощь будет принята.

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

Так, например, у меня есть это:

 Private Declare Function GetAsyncKeyState Lib "user32" _
 (ByVal vKey As KeyCodeConstants) As Long

 Private Const VK_A = &H41

 Private Sub keyboardTimer001_Timer()
    If KeyDown(VK_A) Then
       ' do my stuff, but DONT DISPLAY the letter "A"
    End If
 end sub

Так что это в основном просто таймер (интервал 1) проверка asyn c клавиатуры. Если обнаруживается, что буква «а» была нажата, я выполняю действие. Но я хочу сделать это БЕЗ печати буквы "а". Как бы я удалить ключ из буфера клавиатуры / предотвратить его отображение? (Примечание: не уверен, что что-то вроде 'PeekMessage' будет работать - если так - кто-нибудь знает, где я могу найти хороший пример кода vb6, где я могу искать такие вещи, как 'ctrl + a' или 'ctrl + alt + a' , et c, et c, а затем просто очистите буфер и выполните мое действие?)

Спасибо!

1 Ответ

2 голосов
/ 12 апреля 2020

Вы можете использовать комбинацию RegisterHotKey и PeekMessage. Следующий код определяет клавиши Key-A и Ctrl-A для выполнения действий:

Основная форма

Option Explicit

Private Done As Boolean

Private Sub Form_Activate()
   Done = False
   RegisterHotKey Me.hWnd, &HBBBB&, MOD_NONE, vbKeyA
   RegisterHotKey Me.hWnd, &HBBBA&, MOD_CONTROL, vbKeyA
   ProcessMessages
End Sub

Private Sub ProcessMessages()
   Dim Message As Msg

   Do While Not Done
      WaitMessage

      If PeekMessage(Message, Me.hWnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then
         If Message.wParam = &HBBBB& Then
            MsgBox "This is my Key-A action"
         ElseIf Message.wParam = &HBBBA& Then
            MsgBox "This is my Ctrl-A action"
         End If
      End If

      DoEvents
   Loop
End Sub

Private Sub Form_Unload(Cancel As Integer)
   Done = True
   Call UnregisterHotKey(Me.hWnd, &HBBBB&)
   Call UnregisterHotKey(Me.hWnd, &HBBBA&)
End Sub

Приведенный выше код работает хорошо, но в производственном приложении I может склоняться к созданию подкласса главного окна. Если вы предпочитаете создание подклассов, вам нужно будет использовать выбранную вами технику и заменить метод ProcessMessages на что-то вроде этого:

Private Function ISubclass_WindowProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Select Case iMsg
      Case WM_HOTKEY
         If wParam = &HBBBB& Then
            MsgBox "This is my Key-A action"
         ElseIf wParam = &HBBBA& Then
            MsgBox "This is my Ctrl-A action"
         End If
   End Select
End Function

Как вы видите, подклассы немного чище. Конечно, вам нужно определить материал Win API. Поэтому в модуле поместите следующий код:

Модуль

Option Explicit

Public Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long) As Long
Public 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
Public Declare Function WaitMessage Lib "user32" () As Long

Public Const MOD_NONE = &H0
Public Const MOD_ALT = &H1
Public Const MOD_CONTROL = &H2
Public Const MOD_SHIFT = &H4
Public Const MOD_WIN = &H8
Public Const PM_REMOVE = &H1
Public Const WM_HOTKEY = &H312

Public Type POINTAPI
   x As Long
   y As Long
End Type

Public Type Msg
   hWnd As Long
   Message As Long
   wParam As Long
   lParam As Long
   time As Long
   pt As POINTAPI
End Type
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...