我已经搜索过,但似乎找不到答案,因此,我们将不胜感激。
我想创建一个热键,但是当按下热键时,我不想显示实际的“字符”,而只是要执行的操作。
例如,我有这个:
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和PeekMessage。以下代码定义了Ctrl-A来执行您的操作:
主要形式
Option Explicit
Private Done As Boolean
Private Sub Form_Activate()
Done = False
RegisterHotKey Me.hWnd, &HBBBB&, MOD_CONTROL, vbKeyA
ProcessMessages
End Sub
Public Sub ProcessMessages()
Dim Message As Msg
Do While Not Done
WaitMessage
If PeekMessage(Message, Me.hWnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then
MsgBox "This is my action"
End If
DoEvents
Loop
End Sub
Private Sub Form_Unload(Cancel As Integer)
Done = True
Call UnregisterHotKey(Me.hWnd, &HBBBB&)
End Sub
模块
当然,您需要定义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