vb6是否使用API抑制键盘笔划?(制作热键)

vb6是否使用API抑制键盘笔划?(制作热键),vb6,Vb6,我已经搜索过了,似乎找不到答案,所以如果有任何帮助,我将不胜感激 我想做一个热键,但当按下热键时,我不想显示实际的“字符”,只想执行动作 举个例子,我有: Private Declare Function GetAsyncKeyState Lib "user32" _ (ByVal vKey As KeyCodeConstants) As Long Private Const VK_A = &H41 Private Sub keyboardTimer001_Timer()

我已经搜索过了,似乎找不到答案,所以如果有任何帮助,我将不胜感激

我想做一个热键,但当按下热键时,我不想显示实际的“字符”,只想执行动作

举个例子,我有:

 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”等内容,然后清除缓冲区,执行我的操作吗?)


谢谢

您可以使用RegisterHotKey和peek消息的组合。以下代码定义了用于执行操作的键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
上述代码运行良好,但在生产应用程序中,我可能倾向于对主窗口进行子类化。如果您更喜欢子类化,则需要使用您选择的一种技术,并将
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
正如您所看到的,子类化稍微干净了一点。当然,您需要定义WinAPI。因此,在模块中,放置以下代码:

模块

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

您是否考虑过(或尝试过)将表单的
KeyPreview
设置为
True
,并在
\u KeyPress
事件中执行击键?是的,不起作用-我希望它全局工作(即,当表单失去焦点时)。keypreview仅在窗体当前有焦点时有效。您好,谢谢!刚刚注意到这一点-我很快就会尝试,并让你知道结果,谢谢!是的-基本上我希望能够使用keybd_事件像一个宏打字机一样进行操作-所以我不希望在“键入”内容时再次调用代码。。。这样行吗?(我假设我可以有一个标志,这样当我开始实际的“键入”时,处理消息就会停止,当我完成时,我会再次重新启动,对吗?)谢谢!我不确定你的确切意思,但这段代码肯定会满足你在原始问题中的要求。