vb6 用 API 抑制键盘敲击?(制作热键) [英] vb6 suppress keyboard strokes with API? (making a hotkey)

查看:26
本文介绍了vb6 用 API 抑制键盘敲击?(制作热键)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经搜索过,但似乎找不到答案,因此我们将不胜感激.

I've searched, and can't seem to find an answer, so any help would be appreciated.

我想做一个热键,但是当按下热键时,我不希望显示实际的字符",只显示要执行的操作.

I want to make a hotkey, but when the hotkey is pressed, I don't want the actual "character" to be displayed, just the action to be performed.

例如,我有这个:

 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)检查异步键盘.如果它检测到字母a"被按下,我执行一个动作.但我希望它在不打印字母a"的情况下做到这一点.如何从键盘缓冲区中删除键/防止它显示?(旁注 - 不确定像PeekMessage"这样的东西是否可行 - 如果可以的话 - 有谁知道我在哪里可以找到一个好的 vb6 代码示例,我可以在那里查看诸如ctrl+a"或ctrl+alt+a"之类的东西等,然后清除缓冲区,然后执行我的操作?)

So this basically just has a timer (interval 1) checking the async keyboard. If it detects that the letter "a" was pressed, I perform an action. But I want it to do this WITHOUT printing the letter "a". How would I remove the key from the keyboard buffer/prevent it from displaying? (Side note - not sure if something like 'PeekMessage' would work - if so - does anyone know where I can find a good vb6 code sample where I can peek for stuff like 'ctrl+a' or 'ctrl+alt+a', etc, etc and then just clear the buffer, and perform my action?)

谢谢!

推荐答案

您可以结合使用 RegisterHotKey 和 PeekMessage.以下代码定义了 Key-A 和 Ctrl-A 来执行操作:

You can use a combination of RegisterHotKey and PeekMessage. The following code defines Key-A and Ctrl-A to perform actions:

主窗体

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

上述代码运行良好,但在生产应用程序中,我可能倾向于对主窗口进行子类化.如果您更喜欢子类化,则需要使用您选择的技术并将 ProcessMessages 方法替换为以下内容:

The above code works well, but in a production app I might lean towards subclassing the main window. If you prefer subclassing, you will need to use a technique of your choosing and replace the ProcessMessages method with something like this:

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 的东西.所以在一个模块中,放置以下代码:

As you can see, subclassing is a little cleaner. Of course, you need to define the Win API stuff. So in a module, place the following code:

模块

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

这篇关于vb6 用 API 抑制键盘敲击?(制作热键)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆