紫外工控论坛

 找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 2283|回复: 0

[VB/VB.NET] VB编写全局HOOK

[复制链接]
冰糖 发表于 2011-11-14 15:27:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
  1. 一、新建一个ActiveX Dll工程,名字栏里取名为SysHook

  2. 二、添加一个模块,取名为mHook,添加代码如下:

  3. Option Explicit
  4. Type POINTAPI
  5.         x As Long
  6.         y As Long
  7. End Type

  8. Type TMSG
  9.     hwnd As Long
  10.     message As Long
  11.     wParam As Long
  12.     lParam As Long
  13.     time As Long
  14.     pt As POINTAPI
  15. End Type

  16. Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)
  17. Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  18. Public hJournalHook As Long, hAppHook As Long
  19. Public SHptr As Long
  20. Public Const WM_CANCELJOURNAL = &H4B

  21. Public Function JournalRecordProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  22.   If nCode < 0 Then
  23.      JournalRecordProc = CallNextHookEx(hJournalHook, nCode, wParam, lParam)
  24.      Exit Function
  25.   End If
  26.   ResolvePointer(SHptr).FireEvent lParam
  27.   Call CallNextHookEx(hJournalHook, nCode, wParam, lParam)
  28. End Function

  29. Public Function AppHookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  30.    If nCode < 0 Then
  31.       AppHookProc = CallNextHookEx(hAppHook, nCode, wParam, lParam)
  32.       Exit Function
  33.    End If
  34.    Dim msg As TMSG
  35.    CopyMemory msg, ByVal lParam, Len(msg)
  36.    Select Case msg.message
  37.        Case WM_CANCELJOURNAL
  38.             If wParam = 1 Then ResolvePointer(SHptr).FireEvent WM_CANCELJOURNAL
  39.    End Select
  40.    Call CallNextHookEx(hAppHook, nCode, wParam, ByVal lParam)
  41. End Function

  42. Private Function ResolvePointer(ByVal lpObj&) As cSystemHook
  43.   Dim oSH As cSystemHook
  44.   CopyMemory oSH, lpObj, 4&
  45.   Set ResolvePointer = oSH
  46.   CopyMemory oSH, 0&, 4&
  47. End Function

  48. 三、把工程自动建立的Class1类模块改名为cSystemHook,添加代码如下:

  49. Option Explicit
  50. Public Event MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
  51. Public Event MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
  52. Public Event MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
  53. Public Event KeyDown(KeyCode As Integer, Shift As Integer)
  54. Public Event KeyUp(KeyCode As Integer, Shift As Integer)
  55. Public Event SystemKeyDown(KeyCode As Integer)
  56. Public Event SystemKeyUp(KeyCode As Integer)

  57. 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
  58. Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
  59. Private Declare Function GetAsyncKeyState% Lib "user32" (ByVal vKey As Long)

  60. Private Const WM_KEYDOWN = &H100
  61. Private Const WM_KEYUP = &H101
  62. Private Const WM_MOUSEMOVE = &H200
  63. Private Const WM_LBUTTONDOWN = &H201
  64. Private Const WM_LBUTTONUP = &H202
  65. Private Const WM_LBUTTONDBLCLK = &H203
  66. Private Const WM_RBUTTONDOWN = &H204
  67. Private Const WM_RBUTTONUP = &H205
  68. Private Const WM_RBUTTONDBLCLK = &H206
  69. Private Const WM_MBUTTONDOWN = &H207
  70. Private Const WM_MBUTTONUP = &H208
  71. Private Const WM_MBUTTONDBLCLK = &H209
  72. Private Const WM_MOUSEWHEEL = &H20A
  73. Private Const WM_SYSTEMKEYDOWN = &H104
  74. Private Const WM_SYSTEMKEYUP = &H105

  75. Private Const WH_JOURNALRECORD = 0
  76. Private Const WH_GETMESSAGE = 3

  77. Private Type EVENTMSG
  78.      wMsg As Long
  79.      lParamLow As Long
  80.      lParamHigh As Long
  81.      msgTime As Long
  82.      hWndMsg As Long
  83. End Type

  84. Dim EMSG As EVENTMSG

  85. Public Function SetHook() As Boolean
  86.    If hJournalHook = 0 Then hJournalHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf JournalRecordProc, App.hInstance, 0)
  87.    If hAppHook = 0 Then hAppHook = SetWindowsHookEx(WH_GETMESSAGE, AddressOf AppHookProc, App.hInstance, App.ThreadID)
  88.    SetHook = True
  89. End Function

  90. Public Sub RemoveHook()
  91.    UnhookWindowsHookEx hAppHook
  92.    UnhookWindowsHookEx hJournalHook
  93.    hAppHook = 0
  94.    hJournalHook = 0
  95. End Sub

  96. Private Sub Class_Initialize()
  97.   SHptr = ObjPtr(Me)
  98. End Sub

  99. Private Sub Class_Terminate()
  100.   If hJournalHook Or hAppHook Then RemoveHook
  101. End Sub

  102. Friend Function FireEvent(ByVal lParam As Long)
  103.   Dim i%, j%, k%
  104.   Dim s As String
  105.   If lParam = WM_CANCELJOURNAL Then
  106.      hJournalHook = 0
  107.      SetHook
  108.      Exit Function
  109.   End If
  110.   
  111.   CopyMemory EMSG, ByVal lParam, Len(EMSG)
  112.   Select Case EMSG.wMsg
  113.     Case WM_KEYDOWN
  114.          j = 0
  115.          If GetAsyncKeyState(vbKeyShift) Then j = (j Or 1)        'fixed by JJ
  116.          If GetAsyncKeyState(vbKeyControl) Then j = (j Or 2)      'fixed by JJ
  117.          If GetAsyncKeyState(vbKeyMenu) Then j = (j Or 4)         'fixed by JJ
  118.          s = Hex(EMSG.lParamLow)
  119.          k = (EMSG.lParamLow And &HFF)
  120.          RaiseEvent KeyDown(k, j)
  121.          s = Left$(s, 2) & Right$("00" & Hex(k), 2)               'fixed by JJ
  122.          EMSG.lParamLow = CLng("&h" & s)
  123.          CopyMemory ByVal lParam, EMSG, Len(EMSG)
  124.     Case WM_KEYUP
  125.          j = 0                                                    'fixed by JJ
  126.          If GetAsyncKeyState(vbKeyShift) Then j = (j Or 1)        'fixed by JJ
  127.          If GetAsyncKeyState(vbKeyControl) Then j = (j Or 2)      'fixed by JJ
  128.          If GetAsyncKeyState(vbKeyMenu) Then j = (j Or 4)         'fixed by JJ
  129.          s = Hex(EMSG.lParamLow)
  130.          k = (EMSG.lParamLow And &HFF)
  131.          RaiseEvent KeyUp(k, j)
  132.          s = Left$(s, 2) & Right$("00" & Hex(k), 2)               'fixed by JJ
  133.          EMSG.lParamLow = CLng("&h" & s)
  134.          CopyMemory ByVal lParam, EMSG, Len(EMSG)
  135.     Case WM_MOUSEMOVE
  136.          i = 0                                                    'fixed by JJ
  137.          If GetAsyncKeyState(vbKeyLButton) Then i = (i Or 1)      'fixed by JJ
  138.          If GetAsyncKeyState(vbKeyRButton) Then i = (i Or 2)      'fixed by JJ
  139.          If GetAsyncKeyState(vbKeyMButton) Then i = (i Or 4)      'fixed by JJ
  140.          j = 0                                                    'fixed by JJ
  141.          If GetAsyncKeyState(vbKeyShift) Then j = (j Or 1)        'fixed by JJ
  142.          If GetAsyncKeyState(vbKeyControl) Then j = (j Or 2)      'fixed by JJ
  143.          If GetAsyncKeyState(vbKeyMenu) Then j = (j Or 4)         'fixed by JJ
  144.          RaiseEvent MouseMove(i, j, CSng(EMSG.lParamLow), CSng(EMSG.lParamHigh))
  145.     Case WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN
  146.          i = 0                                                    'fixed by JJ
  147.          If GetAsyncKeyState(vbKeyShift) Then i = (i Or 1)        'fixed by JJ
  148.          If GetAsyncKeyState(vbKeyControl) Then i = (i Or 2)      'fixed by JJ
  149.          If GetAsyncKeyState(vbKeyMenu) Then i = (i Or 4)         'fixed by JJ
  150.          RaiseEvent MouseDown(2 ^ ((EMSG.wMsg - 513) / 3), i, CSng(EMSG.lParamLow), CSng(EMSG.lParamHigh))
  151.     Case WM_LBUTTONUP, WM_RBUTTONUP, WM_MBUTTONUP
  152.          i = 0                                                    'fixed by JJ
  153.          If GetAsyncKeyState(vbKeyShift) Then i = (i Or 1)        'fixed by JJ
  154.          If GetAsyncKeyState(vbKeyControl) Then i = (i Or 2)      'fixed by JJ
  155.          If GetAsyncKeyState(vbKeyMenu) Then i = (i Or 4)         'fixed by JJ
  156.          RaiseEvent MouseUp(2 ^ ((EMSG.wMsg - 514) / 3), i, CSng(EMSG.lParamLow), CSng(EMSG.lParamHigh))
  157.     Case WM_SYSTEMKEYDOWN
  158.          s = Hex(EMSG.lParamLow)
  159.          k = (EMSG.lParamLow And &HFF)
  160.          If k <> vbKeyMenu Then RaiseEvent SystemKeyDown(k)
  161.          s = Left$(s, 2) & Right$("00" & Hex(k), 2)               'fixed by JJ
  162.          EMSG.lParamLow = CLng("&h" & s)
  163.          CopyMemory ByVal lParam, EMSG, Len(EMSG)
  164.     Case WM_SYSTEMKEYUP
  165.          s = Hex(EMSG.lParamLow)
  166.          k = (EMSG.lParamLow And &HFF)
  167.          If k <> vbKeyMenu Then RaiseEvent SystemKeyUp(k)
  168.          s = Left$(s, 2) & Right$("00" & Hex(k), 2)               'fixed by JJ
  169.          EMSG.lParamLow = CLng("&h" & s)
  170.          CopyMemory ByVal lParam, EMSG, Len(EMSG)
  171.     Case Else
  172.   End Select
  173. End Function

  174. Public Property Get HookState() As Boolean
  175.     If hAppHook = 0 Then
  176.         HookState = False
  177.     Else
  178.         HookState = True
  179.     End If
  180. End Property



  181. 四、千万别望了保存(否则你要后悔的),编译生成DLL,然后可以测试了,做一个普通的工程,添加引用SysHook,在窗体中添加测试代码(嘿嘿,可能你会吃点苦头):

  182. Option Explicit

  183. Dim WithEvents sh As cSystemHook

  184. Private Sub Form_Load()
  185.    Set sh = CreateObject("syshook.cSystemHook")
  186.    sh.SetHook
  187. End Sub

  188. Private Sub Form_Unload(Cancel As Integer)
  189.   sh.RemoveHook
  190.   Set sh = Nothing
  191. End Sub

  192. Private Sub sh_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
  193.   If Button = 1 Then
  194.     Text1 = "你按了左键,在坐标:X=" & x & " Y=" & y
  195.   End If
  196.   If Button = 2 Then
  197.    Text1 = "你按了右键,在坐标:X=" & x & " Y=" & y
  198.   End If
  199. End Sub


  200. 五、接着你可以试试全局的下列事件(记住刚才的教训,可要小心哦):

  201. Private Sub sh_KeyDown(KeyCode As Integer, Shift As Integer)

  202. End Sub

  203. Private Sub sh_KeyUp(KeyCode As Integer, Shift As Integer)

  204. End Sub

  205. MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)

  206. End Sub

  207. Private Sub sh_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)

  208. End Sub

  209. Private Sub sh_SystemKeyDown(KeyCode As Integer)

  210. End Sub

  211. Private Sub sh_SystemKeyUp(KeyCode As Integer)

  212. End Sub
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


--------------------------------------------------------------------------------------------------------------------
本站是工控技术交流站点,论坛内容均为网络收集或会员所发表,并不代表本站立场,会员拥有该内容的所有权力及责任!
本站内容如有侵犯您的版权,请按下面方式联系本站管理员,我们将及时删除处理
管理员:冰糖 QQ:5483695(请直击主题), Mail:admin#ziwai.net(#改成@) 其它非本人.
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!

QQ|Archiver|手机版|小黑屋|紫外工控论坛. ( 苏ICP备11032118号-1 )

GMT+8, 2024-4-29 20:52 , Processed in 0.375005 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表