关于vb6全局键盘事件

代码如下:PrivateDeclareFunctionGetAsyncKeyStateLib"user32"(ByValvKeyAsLong)AsIntegerPriva... 代码如下:
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

Private Sub Timer1_Timer()
If GetAsyncKeyState(vbKeyF5) Then
Text1 = Text1 & "1"
End If
End Sub

我想要只要按下F5(不松开),就显示一次1。请问高手,怎么修改代码?
展开
 我来答
dongao8080
2013-08-03 · TA获得超过484个赞
知道小有建树答主
回答量:705
采纳率:66%
帮助的人:444万
展开全部

窗体中

Private Sub Form_Load()
HooK
End Sub

Private Sub Form_Unload(Cancel As Integer)
UnHooK
End Sub

 

下面是模块,加入至工程:

 Private Declare Function CallNextHookEx Lib "user32" _
 (ByVal hHook As Long, _
 ByVal nCode As Long, _
 ByVal wParam As Long, _
 lParam As Any) As Long
  
 Private Declare Function SetWindowsHookEx Lib "user32" _
 Alias "SetWindowsHookExA" _
 (ByVal idHook As Long, _
 ByVal lpfn As Long, _
 ByVal hmod As Long, _
 ByVal dwThreadId As Long) As Long
  
 Private Declare Function UnhookWindowsHookEx Lib "user32" _
 (ByVal hHook As Long) As Long
  
 Private Declare Sub CopyMemory Lib "kernel32" _
 Alias "RtlMoveMemory" _
 (Destination As Any, _
 Source As Any, _
 ByVal Length As Long)
  
 Private Type PKBDLLHOOKSTRUCT
 vkCode As Long
 scanCode As Long
 flags As Long
 time As Long
 dwExtraInfo As Long
 End Type
 Private Const WM_KEYDOWN = &H100
 Private Const WM_SYSKEYDOWN = &H104
 Private Const WM_KEYUP = &H101
 Private Const WM_SYSKEYUP = &H105
  
 Private Const HC_ACTION = 0
 Private Const WH_KEYBOARD_LL = 13
 Private lngHook As Long
 
 Public Function HotKey(ByVal nCode As Long, _
 ByVal wParam As Long, _
 ByVal lParam As Long) As Long
 Dim p As PKBDLLHOOKSTRUCT
 If nCode = HC_ACTION Then
 Select Case wParam
 Case WM_KEYDOWN, WM_SYSKEYDOWN
 Call CopyMemory(p, ByVal lParam, Len(p))
 If p.vkCode = vbKeyF5 Then   '开始
    Form1.Text1.Text=Form1.Text1.Text & "1"
 End If
 Case Else
  
 End Select
 End If
 Call CallNextHookEx(WH_KEYBOARD_LL, nCode, wParam, lParam)
 End Function
  
 Public Sub HooK()
 lngHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf HotKey, App.hInstance, 0)
 End Sub
  
 Public Sub UnHooK()
 Call UnhookWindowsHookEx(lngHook)
 End Sub
追问
我觉得太麻烦了。假如我要做个全局键盘钩子呢?
zbater
推荐于2016-05-19
知道答主
回答量:21
采纳率:0%
帮助的人:11.1万
展开全部
代码最上面加个变量

dim runonce as boolean

以下代码稍微改一下即可

Private Sub Timer1_Timer()
If GetAsyncKeyState(vbKeyF5)=ture and runonce=false Then
Text1 = Text1 & "1"
runonce=true
End If
End Sub

然后在按键抬起事件时再把变量设置为runonce=false即可
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
风雪剑无痕
2013-08-03 · TA获得超过1253个赞
知道大有可为答主
回答量:1691
采纳率:100%
帮助的人:1685万
展开全部
窗体的KeyPreview属性设为true,用Form_KeyDown试试
追问
这个好像不能实现全局吧?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式