楚天哲 发表于 2010-6-3 13:04:00

VB实现全局钩子

这是我写的一个小程序。我的目的:是在启动我的程序后,我在启动其他的程序,比如打开记事本,我在记事本里输入字母A同时我也希望通过A键来触发我编写的那个程序的按钮事件。我再网上查的说需要安装全局钩子来时截取键盘信息。来实现这个功能。但是我一直做不出来,希望各位答谢给看一下。如果给写个例子就再好不过了,在这先谢谢了

admin 发表于 2010-6-3 16:35:38

呵呵,实现了,用VB就是累人……
Form窗口代码:
Private Sub Command1_Click()
Label1.Caption = "全局钩子测试"
End Sub
Private Sub Form_Load()
hHook = SetWindowsHookEx(13, AddressOf MyKBHook, App.hInstance, 0) '全局
'hHook = SetWindowsHookEx(2, AddressOf MyKBHook, 0, App.ThreadID)'局部
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim ret As Long
    ret = UnhookWindowsHookEx(hHook)
End Sub
模块代码:
Public 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
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Public Const vbKeyA = 65
Public hHook As Long
Public Const BM_CLICK = &HF5
Public Type RECT
      Left As Long
      Top As Long
      Right As Long
      Bottom As Long
End Type

Public Function MyKBHook(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim msg As Long
Dim lpRect As RECT
Dim x As Long, y As Long
If ncode = 0 Then
    'If wParam = vbKeyA Then
    If GetKeyState(vbKeyA) And &H8000 Then
      GetWindowRect Form1.Command1.hwnd, lpRect
      x = lpRect.Left: y = lpRect.Top
      PostMessage Form1.Command1.hwnd, BM_CLICK, 0, y / 15 * 65536 + x
      Sleep (100)
      PostMessage Form1.Command1.hwnd, BM_CLICK, 0, y / 15 * 65536 + x
    End If
End If
If ncode <> 0 Then
Call CallNextHookEx(hHook, iCode, wParam, lParam)
End If
End Function

supercjj2008 发表于 2010-6-11 16:28:13

版主真是用心啊,赞一个!

maowei 发表于 2010-9-29 12:14:34

赞一个!~~~~~~~~~
页: [1]
查看完整版本: VB实现全局钩子