VB6全局键盘、鼠标钩子
- 格式:doc
- 大小:27.50 KB
- 文档页数:5
Windows钩子函数的概念和实现方法首先我们必须大致了解Windows的基本运作机理,Windows作为一个多任务操作系统,它是分有层次概念的,运行在最底下的称为Ring 0层,在这一层里基本上都是一些硬件驱动程序和Windows的总内核,一般的应用程序极少极少运行在这层,当然也有例外,例如调试软件SoftICE(不过基本上这个软件的作用是Crack软件而不是调试)、还原精灵还有分区魔法大师,就是运行在Ring 0层的,另外就是著名的CIH病毒。
运行在Ring 0级的程序能够对所有硬件进行直接地址级访问,所受到的限制也最小。
消息(Message)传递是Windows独有的一种机制,因为Windows规定运行在Ring 0以上的程序是没有权利知道究竟硬件发生了怎样的中断变化的,Windows统一将这些中断变化封装成一系列的消息(黑箱作业,也就是常说的Black Box),比如鼠标移动,系统产生一个OnMouseMove消息(但这条消息从何而来,相关的硬件中断向量是什么,程序无从得知),OnMouseMove这条消息最后送达每一个窗口程序以供处理。
在更高层次的地方,比如说控件级,所有的消息还被封装成一系列“事件”,比如TextBox控件有KeyPress事件,实际上,这些事件都是林林种种的消息映射。
事件的概念使得程序员能够更加傻瓜化地进行编程,但是从另一个角度来说,这种黑箱作业也使得程序员过分依赖系统的安排,限制了程序员的思维,举个例子,Windows为按钮控件封装了大部分常用的属性和事件,完成一般的常规妈作是没有问题的,但是很遗憾,或许是Windows的疏忽,按钮控件的字体颜色永远默认是黑色,而且Windows没有为此提供一个专门的接口来修改,碰到这种情况,程序员就会非常头疼。
钩子函数(Hook Function),就像一把钩子,它的作用是将消息在抵达窗口程序之前先钩到一个地方以便程序员进行分析,这个地方称为挂接函数链,消息在这里先被一系列的函数处理然后由程序员决定是否交还给Windows系统,在这里,你可以“吞噬”(Lickup)一些你不希望发生的消息,比如说你吞掉所有的键盘消息而不交还给系统,那么键盘将会失灵。
用VB实现的全局键盘钩子2010-04-06 13:30代码功能:实时监测Caps Lock、NumLock、Scroll Lock三个按件的状态,并显示在Label1 Label2 Label3三个标签中'.bas模块中Public m_hDllKbdHook As Long 'public variable holding'the handle to the hook procedurePublic Const WH_KEYBOARD_LL As Long = 13 'enables monitoring of keyboard 'input events about to be posted 'in a thread input queuePrivate Const HC_ACTION As Long = 0 'wParam and lParam parameters'contain information about a'keyboard messagePublic Const VK_CAPITAL As Long = &H14Public Const VK_NUMLOCK As Long = &H90Public Const VK_SCROLL As Long = &H91Private Const LLKHF_UP As Long = &H80& 'test the transition-state flagPublic Type KeyboardByteskbByte(0 To 255) As ByteEnd TypePrivate Type KBDLLHOOKSTRUCTvkCode As Long 'a virtual-key code in the range 1 to 254 scanCode As Long 'hardware scan code for the keyflags As Long 'specifies the extended-key flag,'event-injected flag, context code,'and transition-state flagtime As Long 'time stamp for this messagedwExtraInfo As Long 'extra info associated with the messageEnd TypePublic Declare Function SetWindowsHookEx Lib "user32" _Alias "SetWindowsHookExA" _(ByVal idHook As Long, _ByVal lpfn As Long, _ByVal hmod As Long, _ByVal dwThreadId As Long) As LongPublic Declare Function UnhookWindowsHookEx Lib "user32" _(ByVal hHook As Long) As LongPublic Declare Function CallNextHookEx Lib "user32" _(ByVal hHook As Long, _ByVal nCode As Long, _ByVal wParam As Long, _ByVal lParam As Long) As LongPublic Declare Sub CopyMemory Lib "kernel32" _Alias "RtlMoveMemory" _(pDest As Any, _pSource As Any, _ByVal cb As Long)Public Declare Function GetKeyboardState Lib "user32" _(kbArray As KeyboardBytes) As LongPublic Declare Function GetKeyState Lib "user32" _(ByVal nVirtKey As Long) As IntegerPublic Function LowLevelKeyboardProc(ByVal nCode As Long, _ByVal wParam As Long, _ByVal lParam As Long) As Long Dim kbdllhs As KBDLLHOOKSTRUCTIf nCode = HC_ACTION ThenCall CopyMemory(kbdllhs, ByVal lParam, Len(kbdllhs))If (kbdllhs.flags And LLKHF_UP) ThenSelect Case kbdllhs.vkCodeCase VK_NUMLOCKbel1.Visible = (GetKeyState(VK_NUMLOCK) = &HFF81)Case VK_CAPITALbel2.Visible = (GetKeyState(VK_CAPITAL) = &HFF81)Case VK_SCROLLbel3.Visible = (GetKeyState(VK_SCROLL) = &HFF81)Case ElseEnd SelectEnd IfEnd If 'nCode = HC_ACTIONLowLevelKeyboardProc = CallNextHookEx(m_hDllKbdHook, _nCode, _wParam, _lParam)End FunctionForm1中加入3个标签控件Label1、Label2、Label3Form1中的代码Private Sub Form_Load()Dim kbdState As KeyboardBytesCall GetKeyboardState(kbdState)With Label1.Caption = "Numlock is ON".Alignment = vbRightJustifyEnd WithWith Label2.Caption = "Caps lock is ON".Alignment = vbRightJustifyEnd WithWith Label3.Caption = "Scroll lock is ON".Alignment = vbRightJustifyEnd WithLabel1.Visible = kbdState.kbByte(VK_NUMLOCK) = 1Label2.Visible = kbdState.kbByte(VK_CAPITAL) = 1Label3.Visible = kbdState.kbByte(VK_SCROLL) = 1'set and obtain the handle to the keyboard hookm_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, _AddressOf LowLevelKeyboardProc, _ App.hInstance, _0&)If m_hDllKbdHook = 0 ThenMsgBox "Failed to install low-level keyboard hook."End IfEnd SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)If m_hDllKbdHook <> 0 ThenCall UnhookWindowsHookEx(m_hDllKbdHook)End IfEnd Sub'还有一段可以禁用Ctrl+Esc Alt + Esc Alt+Tab三组热键的Private Const WH_KEYBOARD_LL = 13& 'enables monitoring of keyboard 'input events about to be posted 'in a thread input queuePrivate Const HC_ACTION = 0& 'wParam and lParam parameters 'contain information about a'keyboard messagePrivate Const LLKHF_EXTENDED = &H1& 'test the extended-key flag Private Const LLKHF_INJECTED = &H10& 'test the event-injected flag Private Const LLKHF_ALTDOWN = &H20& 'test the context codePrivate Const LLKHF_UP = &H80& 'test the transition-state flag Private Const VK_TAB = &H9 'virtual key constantsPrivate Const VK_CONTROL = &H11Private Const VK_ESCAPE = &H1BPrivate Type KBDLLHOOKSTRUCTvkCode As Long 'a virtual-key code in the range 1 to 254 scanCode As Long 'hardware scan code for the keyflags As Long 'specifies the extended-key flag,'event-injected flag, context code,'and transition-state flagtime As Long 'time stamp for this messagedwExtraInfo As Long 'extra info associated with the messageEnd TypePrivate Declare Function SetWindowsHookEx Lib "user32" _Alias "SetWindowsHookExA" _(ByVal idHook As Long, _ByVal lpfn As Long, _ByVal hmod As Long, _ByVal dwThreadId As Long) As LongPrivate Declare Function UnhookWindowsHookEx Lib "user32" _(ByVal hHook As Long) As LongPrivate Declare Function CallNextHookEx Lib "user32" _(ByVal hHook As Long, _ByVal nCode As Long, _ByVal wParam As Long, _ByVal lParam As Long) As LongPrivate Declare Sub CopyMemory Lib "kernel32" _Alias "RtlMoveMemory" _(pDest As Any, _pSource As Any, _ByVal cb As Long)Private Declare Function GetAsyncKeyState Lib "user32" _(ByVal vKey As Long) As IntegerPrivate m_hDllKbdHook As Long 'private variable holding'the handle to the hook procedure Public Sub Main()'set and obtain the handle to the keyboard hookm_hDllKbdHook = SetWindowsHookEx(WH_KEYBOARD_LL, _AddressOf LowLevelKeyboardProc, _ App.hInstance, _0&)If m_hDllKbdHook <> 0 ThenMsgBox "Ctrl+Esc, Alt+Tab and Alt+Esc are blocked. " & _"Click OK to quit and re-enable the keys.", _vbOKOnly Or vbInformation, _"Keyboard Hook Active"Call UnhookWindowsHookEx(m_hDllKbdHook)ElseMsgBox "Failed to install low-level keyboard hook - " & stDllErrorEnd IfEnd SubPublic Function LowLevelKeyboardProc(ByVal nCode As Long, _ByVal wParam As Long, _ByVal lParam As Long) As LongStatic kbdllhs As KBDLLHOOKSTRUCTIf nCode = HC_ACTION ThenCall CopyMemory(kbdllhs, ByVal lParam, Len(kbdllhs))'Ctrl+Esc --------------If (kbdllhs.vkCode = VK_ESCAPE) And _CBool(GetAsyncKeyState(VK_CONTROL) _And &H8000) ThenDebug.Print "Ctrl+Esc blocked"LowLevelKeyboardProc = 1Exit FunctionEnd If 'kbdllhs.vkCode = VK_ESCAPE'Alt+Tab --------------If (kbdllhs.vkCode = VK_TAB) And _CBool(kbdllhs.flags And _LLKHF_ALTDOWN) ThenDebug.Print "Alt+Tab blocked"LowLevelKeyboardProc = 1Exit FunctionEnd If 'kbdllhs.vkCode = VK_TAB'Alt+Esc --------------If (kbdllhs.vkCode = VK_ESCAPE) And _CBool(kbdllhs.flags And _LLKHF_ALTDOWN) ThenDebug.Print "Alt+Esc blocked"LowLevelKeyboardProc = 1Exit FunctionEnd If 'kbdllhs.vkCode = VK_ESCAPEEnd If 'nCode = HC_ACTIONLowLevelKeyboardProc = CallNextHookEx(m_hDllKbdHook, _ nCode, _wParam, _lParam)End Function。
VB键盘钩子源码:截取一切键盘按键(2011-07-15 10:52:11)转载▼分类:我的VB标签:杂谈1、UI设计:2、程序源码:(1)FrmHook源码Option ExplicitDim WithEvents Hook As ClsHook '创建一个需要事件支持的Hook为模块ClsHookPrivate Declare Function MapVirtualKeyEx Lib "user32" Alias "MapVirtualKeyExA" (ByVal uCode As Long, ByVal uMapType As Long, ByVal dwhkl As Long) As Long'根据指定的映射类型,执行不同的扫描码和字符转换'' uCode Long,欲转换的源字符或代码' uMapType Long,控制映射类型,如下所示' 0 —— uCode是个虚拟键码?函数返回相应的扫描码' 1 —— uCode是个扫描码?函数返回相应的虚拟键码' 2—— uCode是个虚拟键码。
函数返回相应的ASCII值(未加Shift组合键)。
针对死键,高位设为1。
如果出错,返回NULL' dwhkl Long,键盘布局的句柄Private Declare Function GetKeyboardLayout Lib "user32" (ByVal dwLayout As Long) As Long'取得一个句柄,描述指定应用程序的键盘布局' dwLayout ,//欲检查的线程的标识符Private Declare Function GetForegroundWindow Lib "user32" () As LongPrivate Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long'获取与指定窗口关联在一起的一个进程和线程标识符' lpdwProcessId Long,指定一个变量,用于装载拥有那个窗口的一个进程的标识符' hwnd Long,指定窗口句柄Private Sub Form_Load()Set Hook = New ClsHookHook.SetHook'App.TaskVisible = FalseMe.HideEnd SubPrivate Sub Form_Unload(Cancel As Integer)Hook.UnHookSet Hook = NothingEnd SubPrivate Sub Hook_KeyDown(KeyCode As Integer, Shift As Integer) '钩子的KeyDown事件,在模块中我们自己定义的事件KeyDownDim StrCode As StringStrCode = CodeToString(KeyCode)'判断ShiftIf StrCode = "[Shift]" Or StrCode = "[Alt]" Or StrCode = "[Ctrl]" ThenIf Shift = vbAltMask + vbCtrlMask Then StrCode = "[Alt + Ctrl]"If Shift = vbAltMask + vbShiftMask Then StrCode = "[Alt + Shift]"If Shift = vbCtrlMask + vbShiftMask Then StrCode = "[Ctrl + Shift]"If Shift = vbCtrlMask + vbShiftMask + vbAltMask Then StrCode = "[Ctrl + Shift +Alt]"ElseIf Shift = vbShiftMask Then StrCode = StrCode & " + [Shift]"If Shift = vbCtrlMask Then StrCode = StrCode & " + [Ctrl]"If Shift = vbAltMask Then StrCode = StrCode & " + [Alt]"If Shift = vbAltMask + vbCtrlMask Then StrCode = StrCode & " + [Alt + Ctrl]"If Shift = vbAltMask + vbShiftMask Then StrCode = StrCode & " + [Alt + Shift]"If Shift = vbCtrlMask + vbShiftMask Then StrCode = StrCode & " + [Ctrl + Shift]"If Shift = vbCtrlMask + vbShiftMask + vbAltMask Then StrCode = StrCode & " + [Ctrl + Shift+Alt]"End If'热键Ctrl+J,呼出窗口If StrCode = "[j] + [Ctrl]" ThenMe.ShowApp.TaskVisible = TrueEnd IfText1.Text = Text1.Text & Now & "------" & StrCode & vbCrLfEnd Sub'把按键码换为StringPrivate Function CodeToString(nCode As Integer) As String Dim StrKey As StringSelect Case nCodeCase vbKeyBack: StrKey = "BackSpace"Case vbKeyTab: StrKey = "Tab"Case vbKeyClear: StrKey = "Clear"Case vbKeyReturn: StrKey = "Enter"Case vbKeyShift: StrKey = "Shift"Case vbKeyControl: StrKey = "Ctrl"Case vbKeyMenu: StrKey = "Alt"Case vbKeyPause: StrKey = "Pause"Case vbKeyCapital: StrKey = "CapsLock"Case vbKeyEscape: StrKey = "ESC"Case vbKeySpace: StrKey = "SPACEBAR"Case vbKeyPageUp: StrKey = "PAGE UP"Case vbKeyPageDown: StrKey = "PAGE DOWN"Case vbKeyEnd: StrKey = "END"Case vbKeyHome: StrKey = "HOME"Case vbKeyLeft: StrKey = "LEFT ARROW"Case vbKeyUp: StrKey = "UP ARROW"Case vbKeyRight: StrKey = "RIGHT ARROW"Case vbKeyDown: StrKey = "DOWN ARROW"Case vbKeySelect: StrKey = "SELECT"Case vbKeyPrint: StrKey = "PRINT SCREEN"Case vbKeyExecute: StrKey = "EXECUTE"Case vbKeySnapshot: StrKey = "SNAPSHOT"Case vbKeyInsert: StrKey = "INS"Case vbKeyDelete: StrKey = "DEL"Case vbKeyHelp: StrKey = "HELP"Case vbKeyNumlock: StrKey = "NUM LOCK"Case vbKey0 To vbKey9: StrKey = Chr$(nCode)Case vbKeyA To vbKeyZ: StrKey = LCase(Chr$(nCode)) 'MapVirtualKeyEx(nCode, 2, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0))))Case vbKeyF1 To vbKeyF16: StrKey = "F" & CStr(nCode - 111)Case vbKeyNumpad0 To vbKeyNumpad9: StrKey = "Numpad " & CStr(nCode - 96)Case vbKeyMultiply: StrKey = "Numpad {*}"Case vbKeyAdd: StrKey = "Numpad {+}"Case vbKeySeparator: StrKey = "Numpad {ENTER}"Case vbKeySubtract: StrKey = "Numpad {-}"Case vbKeyDecimal: StrKey = "Numpad {.}"Case vbKeyDivide: StrKey = "Numpad {/}"Case ElseStrKey = Chr$(MapVirtualKeyEx(nCode, 2, GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, 0)))) End SelectCodeToString = "[" & StrKey & "]"End FunctionPrivate Sub text1_Change()Text1.SelStart = Len(Text1.Text)End Sub(2)ModHook源码Option ExplicitPublic Declare Function CallNextHookEx Lib "user32.dll" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lparam As Any) As LongPublic Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)Public OldHook As Long '全局变量OldHook存储钩子句柄Public LngClsPtr As Long '保存对象地址'回调函数Public Function BackHook(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As LongIf nCode < 0 Then '如果nCode小于0,上次就说过喽,小于0代表没有拦截到键盘消息;当nCode为0的时候,所有的键盘消息都将被拦截,BackHook = CallNextHookEx(OldHook, nCode, wParam, lparam) 'wParam为消息的种类(种类知道吧?KeyDown ……)lparam存储了拦截到的消息;没有拦截到消息只好呼叫下个钩子Exit FunctionEnd IfResolvePointer(LngClsPtr).RiseEvent (lparam) '得到消息的地址'处理过后一定要将消息归还给系统,难免还有别人要这个消息呢?Call CallNextHookEx(OldHook, nCode, wParam, lparam)End Function'得到对象的地址Private Function ResolvePointer(ByVal lpObj As Long) As ClsHookDim oSH As ClsHookCopyMemory oSH, lpObj, 4&Set ResolvePointer = oSHCopyMemory oSH, 0&, 4&End Function(3)ClsHook源码:Option Explicit '声明,在VB中,开头使用声明可以减少很多的错误Public Event KeyDown(KeyCode As Integer, Shift As Integer) '自定义事件KeyDownPrivate Type EVENTMSG '定义事件消息的类型wMsg As Long '消息lParamLow As LonglParamHigh As LongmsgTime As Long '消息时间hWndMsg As Long '消息句柄End Type'Private Const WH_GETMESSAGE As Long = 3Private Const WH_JOURNALRECORD = 0Private Const WM_KEYDOWN = &H100Private Declare Function SetWindowsHookEx Lib "user32.dll" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long 'dwThreadId监控代码,0为全局钩子Private Declare Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hHook As Long) As Long Private Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal vKey As Long) As Integer Public Sub SetHook()OldHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf BackHook, App.hInstance, 0) End SubPublic Sub UnHook()Call UnhookWindowsHookEx(OldHook)End SubFriend Function RiseEvent(ByVal lparam As Long) As LongDim Msg As EVENTMSGDim IntShift As Integer 'ShiftDim IntCode As Integer 'KeyCodeCopyMemory Msg, ByVal lparam, Len(Msg) '利用指针技术将消息从lparam中的数据拷贝到Msg的地址中,简单的说就是把lparam的数据赋值给MsgIntShift = 0Select Case Msg.wMsg '检查消息状态Case WM_KEYDOWN '如果消息的事件为KeyDown(键盘按下)'得到Shift,Ctrl,Alt的按键状态If GetAsyncKeyState(vbKeyShift) Then IntShift = (IntShift Or 1)If GetAsyncKeyState(vbKeyControl) Then IntShift = (IntShift Or 2)If GetAsyncKeyState(vbKeyMenu) Then IntShift = (IntShift Or 4)IntCode = Msg.lParamLow And &HFF '得到KeyCode(及按键码)RaiseEvent KeyDown(IntCode, IntShift) 'RaiseEvent 引发模块(ClsHook)中声明的事件KeyDownEnd SelectEnd FunctionPrivate Sub Class_Initialize() '初始化类LngClsPtr = ObjPtr(Me) 'ObjPtr,返回对象的地址,将本类的存储地址返回给变量LngClsPtrEnd Sub3、软件运行效果:运行后自动隐藏,按ctrl+j调出程序显示:。
Vb6记录鼠标及回放很多的教学软件或系统监视软件可以自动记录回放用户的输入文字或点击按钮等操作操作,这个功能的实现是使用了Windows的Hook函数。
本文介绍如何通过使用VB来实现鼠标键盘操作的纪录和回放。
Windows提供API函数SetwindowsHookEx来建立一个Hook,通过这个函数可以将一个程序添加到Hook链中监视Windows 消息,函数语法为: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其中参数idHook指定建立的监视函数类型。
通过Windows MSDN帮助可以看到,SetwindowsHookEx函数提供15种不同的消息监视类型,在这里我们将使用WH_JOURNALRECORD和WH_JOURNALPLAYBACK来监视键盘和鼠标操作。
参数lpfn指定消息函数,在相应的消息产生后,系统会调用该函数并将消息值传递给该函数供处理。
函数的一般形式为:Hookproc (code: Integer; wparam: WPARAM; lparam: LPARAM ): LRESULT stdcall;其中code为系统指示标记,wParam和lParam为附加参数,根据不同的消息监视类型而不同。
只要在程序中建立这样一个函数再通过SetwindowsHookEx函数将它加入到消息监视链中就可以处理消息了。
在不需要监视系统消息时需要调用提供UnHookWindowsHookEx来解除对消息的监视。
WH_JOURNALRECORD和WH_JOURNALPLAYBACK类型是两种相反的Hook类型,前者获得鼠标、键盘动作消息,后者回放鼠标键盘消息。
Windows钩子函数的概念和实现方法首先我们必须大致了解Windows的基本运作机理,Windows作为一个多任务操作系统,它是分有层次概念的,运行在最底下的称为Ring 0层,在这一层里基本上都是一些硬件驱动程序和Windows的总内核,一般的应用程序极少极少运行在这层,当然也有例外,例如调试软件SoftICE(不过基本上这个软件的作用是Crack软件而不是调试)、还原精灵还有分区魔法大师,就是运行在Ring 0层的,另外就是著名的CIH病毒。
运行在Ring 0级的程序能够对所有硬件进行直接地址级访问,所受到的限制也最小。
消息(Message)传递是Windows独有的一种机制,因为Windows规定运行在Ring 0以上的程序是没有权利知道究竟硬件发生了怎样的中断变化的,Windows统一将这些中断变化封装成一系列的消息(黑箱作业,也就是常说的Black Box),比如鼠标移动,系统产生一个OnMouseMove消息(但这条消息从何而来,相关的硬件中断向量是什么,程序无从得知),OnMouseMove这条消息最后送达每一个窗口程序以供处理。
在更高层次的地方,比如说控件级,所有的消息还被封装成一系列“事件”,比如TextBox控件有KeyPress事件,实际上,这些事件都是林林种种的消息映射。
事件的概念使得程序员能够更加傻瓜化地进行编程,但是从另一个角度来说,这种黑箱作业也使得程序员过分依赖系统的安排,限制了程序员的思维,举个例子,Windows为按钮控件封装了大部分常用的属性和事件,完成一般的常规妈作是没有问题的,但是很遗憾,或许是Windows的疏忽,按钮控件的字体颜色永远默认是黑色,而且Windows没有为此提供一个专门的接口来修改,碰到这种情况,程序员就会非常头疼。
钩子函数(Hook Function),就像一把钩子,它的作用是将消息在抵达窗口程序之前先钩到一个地方以便程序员进行分析,这个地方称为挂接函数链,消息在这里先被一系列的函数处理然后由程序员决定是否交还给Windows系统,在这里,你可以“吞噬”(Lickup)一些你不希望发生的消息,比如说你吞掉所有的键盘消息而不交还给系统,那么键盘将会失灵。
VB的钩子:本来是因为要做一个小软件,其中要实现的一部分是用鼠标来定位一个座标,那么也就是说本身窗体的焦点可能会离开,就不能使用form的mousedown事件了,那么,使用钩子是可以实现的。
基本想法就是,用钩子获取鼠标点击消息,然后将光标所在的座标记录下来,钩子分为线程钩子和系统钩子。
线程钩子只能钩取本线程的消息,而系统钩子能勾取系统中所有的消息。
VB能实现的只是线程钩子。
而且就算是线程钩子好像对鼠标的操作也不会成功!!学习总是由问题引起的,可能这个问题很简单,但是我努力的去找答案一定会有收获对吗?呵呵。
第一步:建立钩子。
在我的理解,其实就是使用一个API函数,将一个回调函数的地址加入一个钩子队列中,当然可能这个队列只有一个钩子。
那么当发生硬件中断或者软中断的时候,操作系统对这个消息处理的时候,就会照顾到这个钩子,选择一个应用程序的函数来处理它。
vb 的钩子函数是放在一个模块中的,而且在申明的时候都是用public,即在moulde中,呵呵,不知道有没有写错。
好了要想建立钩子,用的是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这个API 函数。
很简单看看这个括号里的几个参数的意义:SetWindowsHookEx 参数有4个idHook As Long 钩子的类型。
以WH_打头的常数,如键盘钩子就是WH_KEYBOARD = 2这些常数在APIViewer里都有。
lpfn As Long 钩子函数的指针。
也就是你在公共模块中定义用来完成你需要的处理的函数或过程。
VB模拟鼠标键盘动作(转)2011-03-31 15:16来自网址:/share/detail/16221474VB模拟鼠标键盘动作有些时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件。
那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制。
当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机。
如何区别是哪一个键被按下了呢?键盘上的所有按键都有一个编码,称作键盘扫描码。
当你按下一个键时,这个键的扫描码就被传给系统。
扫描码是跟具体的硬件相关的,同一个键,在不同键盘上的扫描码有可能不同。
键盘控制器就是将这个扫描码传给计算机,然后交给键盘驱动程序。
键盘驱动程序会完成相关的工作,并把这个扫描码转换为键盘虚拟码。
什么是虚拟码呢?因为扫描码与硬件相关,不具有通用性,为了统一键盘上所有键的编码,于是就提出了虚拟码概念。
无论什么键盘,同一个按键的虚拟码总是相同的,这样程序就可以识别了。
简单点说,虚拟码就是我们经常可以看到的像VK_A,VK_B这样的常数,比如键A的虚拟码是65,写成16进制就是&H41,注意,人们经常用16进制来表示虚拟码。
当键盘驱动程序把扫描码转换为虚拟码后,会把这个键盘操作的扫描码和虚拟码还有其它信息一起传递给操作系统。
然后操作系统则会把这些信息封装在一个消息中,并把这个键盘消息插入到消息列队。
最后,要是不出意外的话,这个键盘消息最终会被送到当前的活动窗口那里,活动窗口所在的应用程序接收到这个消息后,就知道键盘上哪个键被按下,也就可以决定该作出什么响应给用户了。
这个过程可以简单的如下表示:用户按下按键-----键盘驱动程序将此事件传递给操作系统-----操作系统将键盘事件插入消息队列-----键盘消息被发送到当前活动窗口明白了这个过程,我们就可以编程实现在其中的某个环节来模拟键盘操作了。
using System;using ponentModel;using System.Reflection;using System.Runtime.InteropServices;using System.Windows.Forms;namespace UserActivityMonitor{///<summary>///This class monitors all mouse activities globally (also outside of the application)///and provides appropriate events.///</summary>public static class HookManager{///<summary>///Occurs when the mouse pointer is moved.///</summary>public static event MouseEventHandler MouseMove{add{EnsureSubscribedToGlobalMouseEvents();s_MouseMove += value;}remove{s_MouseMove -= value;TryUnsubscribeFromGlobalMouseEvents();}}///<summary>///Occurs when a click was performed by the mouse.///</summary>public static event MouseEventHandler MouseClick{add{EnsureSubscribedToGlobalMouseEvents();s_MouseClick += value;}remove{s_MouseClick -= value;TryUnsubscribeFromGlobalMouseEvents();}}///<summary>///Occurs when the mouse a mouse button is pressed.///</summary>public static event MouseEventHandler MouseDown{add{EnsureSubscribedToGlobalMouseEvents();s_MouseDown += value;}remove{s_MouseDown -= value;TryUnsubscribeFromGlobalMouseEvents();}}///<summary>///Occurs when a mouse button is released.///</summary>public static event MouseEventHandler MouseUp{add{EnsureSubscribedToGlobalMouseEvents();s_MouseUp += value;}remove{s_MouseUp -= value;TryUnsubscribeFromGlobalMouseEvents();}}///<summary>///Occurs when the mouse wheel moves.///</summary>public static event MouseEventHandler MouseWheel {add{EnsureSubscribedToGlobalMouseEvents();s_MouseWheel += value;}remove{s_MouseWheel -= value;TryUnsubscribeFromGlobalMouseEvents();}}///<summary>///Occurs when a double clicked was performed by the mouse.///</summary>public static event MouseEventHandler MouseDoubleClick{add{EnsureSubscribedToGlobalMouseEvents();if (s_MouseDoubleClick == null){s_DoubleClickTimer = new Timer{Interval = GetDoubleClickTime(),Enabled = false };s_DoubleClickTimer.Tick += DoubleClickTimeElapsed; MouseUp += OnMouseUp;}s_MouseDoubleClick += value;}remove{if (s_MouseDoubleClick != null){s_MouseDoubleClick -= value;if (s_MouseDoubleClick == null){MouseUp -= OnMouseUp;s_DoubleClickTimer.Tick -= DoubleClickTimeElapsed; s_DoubleClickTimer = null;}}TryUnsubscribeFromGlobalMouseEvents();}}///<summary>///Occurs when a key is released.///</summary>public static event KeyEventHandler KeyUp{add{EnsureSubscribedToGlobalKeyboardEvents();s_KeyUp += value;}remove{s_KeyUp -= value;TryUnsubscribeFromGlobalKeyboardEvents();}}///<summary>///Occurs when a key is preseed.///</summary>public static event KeyEventHandler KeyDown{add{EnsureSubscribedToGlobalKeyboardEvents(); s_KeyDown += value;}remove{s_KeyDown -= value;TryUnsubscribeFromGlobalKeyboardEvents(); }}///<summary>///Occurs when a key is pressed.///</summary>///<remarks>///Key events occur in the following order:///<list type="number">///<item>KeyDown</item>///<item>KeyPress</item>///<item>KeyUp</item>///</list>///The KeyPress event is not raised by noncharacter keys; however, the noncharacter keys do raise the KeyDown and KeyUp events.///Use the KeyChar property to sample keystrokes at run time and to consume or modify a subset of common keystrokes.///To handle keyboard events only in your application and not enable other applications to receive keyboard events,///set the KeyPressEventArgs.Handled property in your form's KeyPress event-handling method to <b>true</b>.///</remarks>public static event KeyPressEventHandler KeyPress{add{EnsureSubscribedToGlobalKeyboardEvents();s_KeyPress += value;}remove{s_KeyPress -= value;TryUnsubscribeFromGlobalKeyboardEvents();}}private static event MouseEventHandler s_MouseMove;private static event MouseEventHandler s_MouseClick;private static event MouseEventHandler s_MouseDown;private static event MouseEventHandler s_MouseUp;private static event MouseEventHandler s_MouseWheel;private static event MouseEventHandler s_MouseDoubleClick;private static MouseButtons s_PrevClickedButton;private static Timer s_DoubleClickTimer;private static void DoubleClickTimeElapsed(object sender, EventArgs e) {s_DoubleClickTimer.Enabled = false;s_PrevClickedButton = MouseButtons.None;}private static void OnMouseUp(object sender, MouseEventArgs e){if (e.Clicks < 1){return;}if(e.Button.Equals(s_PrevClickedButton)){if (s_MouseDoubleClick != null){s_MouseDoubleClick.Invoke(null, e);}s_DoubleClickTimer.Enabled = false;s_PrevClickedButton = MouseButtons.None;}else {s_DoubleClickTimer.Enabled = true;s_PrevClickedButton = e.Button;}}private static event KeyPressEventHandler s_KeyPress;private static event KeyEventHandler s_KeyUp;private static event KeyEventHandler s_KeyDown;private const int WH_MOUSE_LL = 14;private const int WH_KEYBOARD_LL = 13;private const int WM_LBUTTONDOWN = 0x201;private const int WM_RBUTTONDOWN = 0x204;private const int WM_LBUTTONUP = 0x202;private const int WM_RBUTTONUP = 0x205;private const int WM_LBUTTONDBLCLK = 0x203;private const int WM_RBUTTONDBLCLK = 0x206;private const int WM_MOUSEWHEEL = 0x020A;private const int WM_KEYDOWN = 0x100;private const int WM_KEYUP = 0x101;private const int WM_SYSKEYDOWN = 0x104;private const int WM_SYSKEYUP = 0x105;private const byte VK_SHIFT = 0x10;private const byte VK_CAPITAL = 0x14;[DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]private static extern int CallNextHookEx(int idHook,int nCode,int wParam,IntPtr lParam);[DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall, SetLastError = true)] private static extern int SetWindowsHookEx(int idHook,HookProc lpfn,IntPtr hMod,int dwThreadId);[DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall, SetLastError = true)] private static extern int UnhookWindowsHookEx(int idHook);[DllImport("user32")]private static extern int GetDoubleClickTime();[DllImport("user32")]private static extern int ToAscii(int uVirtKey,int uScanCode,byte[] lpbKeyState,byte[] lpwTransKey,int fuState);[DllImport("user32")]private static extern int GetKeyboardState(byte[] pbKeyState);[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]private static extern short GetKeyState(int vKey);[StructLayout(LayoutKind.Sequential)]private struct Point{internal readonly int X;internal readonly int Y;}[StructLayout(LayoutKind.Sequential)]private struct MouseLLHookStruct{internal Point Point;internal readonly int MouseData;private readonly int Flags;private readonly int Time;private readonly int ExtraInfo;}[StructLayout(LayoutKind.Sequential)]private struct KeyboardHookStruct{internal readonly int VirtualKeyCode;internal readonly int ScanCode;internal readonly int Flags;private readonly int Time;private readonly int ExtraInfo;}private delegate int HookProc(int nCode, int wParam, IntPtr lParam);private static HookProc s_MouseDelegate;private static int s_MouseHookHandle;private static int m_OldX;private static int m_OldY;private static int MouseHookProc(int nCode, int wParam, IntPtr lParam){if (nCode >= 0){var mouseHookStruct = (MouseLLHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseLLHookStruct));var button = MouseButtons.None;short mouseDelta = 0;var clickCount = 0;var mouseDown = false;switch(wParam){case WM_LBUTTONDOWN:mouseDown = true;button = MouseButtons.Left; clickCount = 1;break;case WM_LBUTTONUP:mouseUp = true;button = MouseButtons.Left; clickCount = 1;break;case WM_LBUTTONDBLCLK:button = MouseButtons.Left; clickCount = 2;break;case WM_RBUTTONDOWN:mouseDown = true;button = MouseButtons.Right; clickCount = 1;break;case WM_RBUTTONUP:button = MouseButtons.Right;clickCount = 1;break;case WM_RBUTTONDBLCLK:button = MouseButtons.Right;clickCount = 2;break;case WM_MOUSEWHEEL:mouseDelta = (short)((mouseHookStruct.MouseData >> 16) & 0xffff);break;}var e = new MouseEventExtArgs(button,clickCount,mouseHookStruct.Point.X,mouseHookStruct.Point.Y,mouseDelta);if (s_MouseUp != null && mouseUp){s_MouseUp.Invoke(null, e);if (s_MouseDown != null && mouseDown){s_MouseDown.Invoke(null, e);}if (s_MouseClick != null && clickCount > 0){s_MouseClick.Invoke(null, e);}if (s_MouseDoubleClick != null && clickCount == 2){s_MouseDoubleClick.Invoke(null, e);}if (s_MouseWheel != null && mouseDelta != 0){s_MouseWheel.Invoke(null, e);}if((s_MouseMove != null) && (m_OldX != mouseHookStruct.Point.X || m_OldY != mouseHookStruct.Point.Y))m_OldX = mouseHookStruct.Point.X;m_OldY = mouseHookStruct.Point.Y;if (s_MouseMove != null){s_MouseMove.Invoke(null, e);}}if(e.Handled){return -1;}}return CallNextHookEx(s_MouseHookHandle, nCode, wParam, lParam); }private static void EnsureSubscribedToGlobalMouseEvents(){if (s_MouseHookHandle != 0){return;}s_MouseDelegate = MouseHookProc;s_MouseHookHandle = SetWindowsHookEx(WH_MOUSE_LL,s_MouseDelegate,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);if (s_MouseHookHandle != 0){return;}throw new Win32Exception(Marshal.GetLastWin32Error());}private static void TryUnsubscribeFromGlobalMouseEvents(){if(s_MouseClick == null&& s_MouseDown == null&& s_MouseMove == null&& s_MouseUp == null&& s_MouseWheel == null){ForceUnsunscribeFromGlobalMouseEvents();}}private static void ForceUnsunscribeFromGlobalMouseEvents(){if (s_MouseHookHandle == 0){return;}var result = UnhookWindowsHookEx(s_MouseHookHandle);s_MouseHookHandle = 0;s_MouseDelegate = null;if (result != 0){return;}throw new Win32Exception(Marshal.GetLastWin32Error());}private static HookProc s_KeyboardDelegate;private static int s_KeyboardHookHandle;private static int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam){var handled = false;if (nCode >= 0){var MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam,typeof(KeyboardHookStruct));if(s_KeyDown != null&& (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN)){var keyData = (Keys)MyKeyboardHookStruct.VirtualKeyCode;var e = new KeyEventArgs(keyData);s_KeyDown.Invoke(null, e);handled = e.Handled;}if (s_KeyPress != null && wParam == WM_KEYDOWN){var isDownShift = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80);var isDownCapslock = (GetKeyState(VK_CAPITAL) != 0);var keyState = new byte[256];GetKeyboardState(keyState);var inBuffer = new byte[2];if(ToAscii(MyKeyboardHookStruct.VirtualKeyCode,MyKeyboardHookStruct.ScanCode,keyState,inBuffer,MyKeyboardHookStruct.Flags) == 1){var key = (char)inBuffer[0];if ((isDownCapslock ^ isDownShift) && Char.IsLetter(key)) key = Char.ToUpper(key);var e = new KeyPressEventArgs(key);s_KeyPress.Invoke(null, e);handled = handled || e.Handled;}}if(s_KeyUp != null&& (wParam == WM_KEYUP || wParam == WM_SYSKEYUP)) {var keyData = (Keys)MyKeyboardHookStruct.VirtualKeyCode;var e = new KeyEventArgs(keyData);s_KeyUp.Invoke(null, e);handled = handled || e.Handled;}}if(handled){return -1;}return CallNextHookEx(s_KeyboardHookHandle, nCode, wParam, lParam); }private static void EnsureSubscribedToGlobalKeyboardEvents(){if (s_KeyboardHookHandle != 0){return;}s_KeyboardDelegate = KeyboardHookProc;s_KeyboardHookHandle = SetWindowsHookEx(WH_KEYBOARD_LL,s_KeyboardDelegate,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);if (s_KeyboardHookHandle != 0){return;}throw new Win32Exception(Marshal.GetLastWin32Error());}private static void TryUnsubscribeFromGlobalKeyboardEvents(){if (s_KeyDown != null || s_KeyUp != null || s_KeyPress != null) {return;}if (s_KeyboardHookHandle == 0){return;}var result = UnhookWindowsHookEx(s_KeyboardHookHandle);s_KeyboardHookHandle = 0;s_KeyboardDelegate = null;if (result != 0){return;}throw new Win32Exception(Marshal.GetLastWin32Error());}}internal class MouseEventExtArgs : MouseEventArgs{internal MouseEventExtArgs(MouseButtons buttons, int clicks, int x, int y, int delta): base(buttons, clicks, x, y, delta){ }internal bool Handled { get; set; }}}。
VB6全局键盘、⿏标钩⼦VB: èü?ì?¢êó±ê13×ó'---------------------------------'Form'°2×°13×óPrivate sub AddHook()'?ü?ì13×ólHook(0) = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf CallKeyHookProc, App.hInstance, 0)'êó±ê13×ólHook(1) = SetWindowsHookEx(WH_MOUSE_LL, AddressOf CallMouseHookProc, App.hInstance, 0)End Sub'D?13×óPrivate sub DelHook()UnhookWindowsHookEx lHook(0)UnhookWindowsHookEx lHook(1)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 LongPublic Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As LongPublic Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As IntegerPublic Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long) Public Type KEYMSGSvKey As Long 'Dé?a?? (and &HFF)sKey As Long 'é¨?è??flag As Long '?ü°′??£o128 ì§?e£o0time As Long 'Window??DDê±??End TypePublic Type MOUSEMSGSX As Long 'x×ù±êY As Long 'y×ù±êa As Longb As Longtime As Long 'Window??DDê±??End TypePublic Type POINTAPIX As LongY As LongEnd TypePublic Const WH_KEYBOARD_LL = 13Public Const WH_MOUSE_LL = 14Public Const Alt_Down = &H20'-----------------------------------------'¢Public Const HC_ACTION = 0Public Const HC_SYSMODALOFF = 5Public Const HC_SYSMODALON = 4'?ü?ì¢Public Const WM_KEYDOWN = &H100Public Const WM_KEYUP = &H101Public Const WM_SYSKEYDOWN = &H104Public Const WM_SYSKEYUP = &H105'êó±ê¢Public Const WM_MOUSEMOVE = &H200Public Const WM_LBUTTONDOWN = &H201Public Const WM_LBUTTONUP = &H202Public Const WM_LBUTTONDBLCLK = &H203Public Const WM_RBUTTONDOWN = &H204Public Const WM_RBUTTONUP = &H205Public Const WM_RBUTTONDBLCLK = &H206Public Const WM_MBUTTONDOWN = &H207Public Const WM_MBUTTONUP = &H208Public Const WM_MBUTTONDBLCLK = &H209Public Const WM_MOUSEACTIVATE = &H21Public Const WM_MOUSEFIRST = &H200Public Const WM_MOUSELAST = &H209Public Const WM_MOUSEWHEEL = &H20APublic Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As LongPublic strKeyName As String * 255Public Declare Function GetActiveWindow Lib "user32" () As Long Public keyMsg As KEYMSGS Public MouseMsg As MOUSEMSGSPublic lHook(1) As Long'----------------------------------------'?£?aêó±êPrivate Const MOUSEEVENTF_LEFTDOWN = &H2Private Const MOUSEEVENTF_LEFTUP = &H4Private Const MOUSEEVENTF_ABSOLUTE = &H8000 ' absolute movePrivate Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long,ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByValdwExtraInfo As Long)Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd AsLong, lpPoint As POINTAPI) As Long'--------------------------------------'?£?a°′?üPrivate Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByValbScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)'êó±ê13×óPublic Function CallMouseHookProc(ByVal code As Long, ByVal wParam AsLong, ByVal lParam As Long) As LongDim pt As POINTAPIIf code = HC_ACTION ThenCopyMemory MouseMsg, lParam, LenB(MouseMsg)Form1.txtMsg(1).Text = "X=" + Str(MouseMsg.X) + " Y=" +Str(MouseMsg.Y)Form1.txtHwnd(1) = Format(wParam, "0")If wParam = WM_MBUTTONDOWN Then '°??D?üa×ó?ümouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0CallMouseHookProc = 1End IfIf wParam = WM_MBUTTONUP Thenmouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0CallMouseHookProc = 1End IfEnd IfIf code <> 0 ThenCallMouseHookProc = CallNextHookEx(0, code, wParam, lParam)End IfEnd Function'?ü?ì13×óPublic Function CallKeyHookProc(ByVal code As Long, ByVal wParam AsLong, ByVal lParam As Long) As LongDim lKey As LongDim strKeyName As String * 255Dim strLen As LongIf code = HC_ACTION ThenCopyMemory keyMsg, lParam, LenB(keyMsg)Select Case wParamCase WM_SYSKEYDOWN, WM_KEYDOWN, WM_SYSKEYUP, WM_KEYUP:lKey = keyMsg.sKey And &HFF 'é¨?è??lKey = lKey * 65536strLen = GetKeyNameText(lKey, strKeyName, 250)Form1.txtMsg(0).Text = "?ü??:" + Left(strKeyName, strLen) + " Dé?a??:" + Format(keyMsg.vKey And &HFF, "0") + " é¨?è??:" + Format(lKey / 65536, "0")Form1.txtHwnd(0) = ""If (GetKeyState(vbKeyControl) And &H8000) ThenForm1.txtHwnd(0) = Form1.txtHwnd(0) + "Ctrl "End IfIf (keyMsg.flag And Alt_Down) <> 0 ThenForm1.txtHwnd(0) = Form1.txtHwnd(0) + "Alt "End IfIf (GetKeyState(vbKeyShift) And &H8000) ThenForm1.txtHwnd(0) = Form1.txtHwnd(0) + "Shift"End If'keyMsg.vKey And &HFF Dé?a??'lKey / 65536 é¨?è??If (keyMsg.vKey And &HFF) = vbKeyY Then '°?Y?üìaN If wParam = WM_SYSKEYDOWN Or wParam =WM_KEYDOWN Then keybd_event vbKeyN, 0, 0, 0End IfCallKeyHookProc = 1 '?á±?°′?üEnd IfEnd SelectEnd IfIf code <> 0 ThenCallKeyHookProc = CallNextHookEx(0, code, wParam, lParam)End IfEnd Function================================================================== =。
基于实现全局键盘鼠标钩子
吴林;刘晔
【期刊名称】《电脑知识与技术》
【年(卷),期】2010(006)036
【摘要】文章通过对Windows系统钩子技术的研究,利用的委托类型且不依赖于DLL实现了全局键盘鼠标钩子.
【总页数】4页(P10328-10331)
【作者】吴林;刘晔
【作者单位】重庆通信学院,机动作战通信系,重庆,400035;重庆通信学院,基础部,重庆,400035
【正文语种】中文
【中图分类】TP311
【相关文献】
1.基于C#的全局键盘钩子过程的实现 [J], 邓杰海;周胜;汤小燕
2.C#下全局鼠标钩子的实现 [J], 袁东锋;张斌
3.基于键盘钩子技术屏蔽任意键的实现 [J], 刘造新;冯少荣
4.基于VB的键盘钩子算法的实现 [J], 周仁云;张关明
5.基于HOOK的鼠标键盘录制的实现 [J], 倪志慧;沈岚岚
因版权原因,仅展示原文概要,查看原文内容请购买。
VB: È«¾Ö¼üÅÌ¡¢Êó±ê¹³×Ó'---------------------------------'Form'°²×°¹³×ÓPrivate sub AddHook()'¼üÅ̹³×ÓlHook(0) = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf CallKeyHookProc, App.hInstance, 0)'Êó±ê¹³×ÓlHook(1) = SetWindowsHookEx(WH_MOUSE_LL, AddressOf CallMouseHookProc, App.hInstance, 0)End Sub'ж¹³×ÓPrivate sub DelHook()UnhookWindowsHookEx lHook(0)UnhookWindowsHookEx lHook(1)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 LongPublic Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As LongPublic Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As IntegerPublic Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long) Public Type KEYMSGSvKey As Long 'ÐéÄâÂë (and &HFF)sKey As Long 'ɨÃèÂëflag As Long '¼ü°´Ï£º128 ̧Æð£º0time As Long 'WindowÔËÐÐʱ¼äEnd TypePublic Type MOUSEMSGSX As Long 'x×ù±êY As Long 'y×ù±êa As Longb As Longtime As Long 'WindowÔËÐÐʱ¼äEnd TypePublic Type POINTAPIX As LongY As LongEnd TypePublic Const WH_KEYBOARD_LL = 13Public Const WH_MOUSE_LL = 14Public Const Alt_Down = &H20'-----------------------------------------'ÏûÏ¢Public Const HC_ACTION = 0Public Const HC_SYSMODALOFF = 5Public Const HC_SYSMODALON = 4'¼üÅÌÏûÏ¢Public Const WM_KEYDOWN = &H100Public Const WM_KEYUP = &H101Public Const WM_SYSKEYDOWN = &H104Public Const WM_SYSKEYUP = &H105'Êó±êÏûÏ¢Public Const WM_MOUSEMOVE = &H200Public Const WM_LBUTTONDOWN = &H201Public Const WM_LBUTTONUP = &H202Public Const WM_LBUTTONDBLCLK = &H203Public Const WM_RBUTTONDOWN = &H204Public Const WM_RBUTTONUP = &H205Public Const WM_RBUTTONDBLCLK = &H206Public Const WM_MBUTTONDOWN = &H207Public Const WM_MBUTTONUP = &H208Public Const WM_MBUTTONDBLCLK = &H209Public Const WM_MOUSEACTIVATE = &H21Public Const WM_MOUSEFIRST = &H200Public Const WM_MOUSELAST = &H209Public Const WM_MOUSEWHEEL = &H20APublic Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As LongPublic strKeyName As String * 255Public Declare Function GetActiveWindow Lib "user32" () As Long Public keyMsg As KEYMSGSPublic MouseMsg As MOUSEMSGSPublic lHook(1) As Long'----------------------------------------'Ä£ÄâÊó±êPrivate Const MOUSEEVENTF_LEFTDOWN = &H2Private Const MOUSEEVENTF_LEFTUP = &H4Private Const MOUSEEVENTF_ABSOLUTE = &H8000 ' absolute movePrivate Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long,ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByValdwExtraInfo As Long)Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd AsLong, lpPoint As POINTAPI) As Long'--------------------------------------'Ä£Äâ°´¼üPrivate Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByValbScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)'Êó±ê¹³×ÓPublic Function CallMouseHookProc(ByVal code As Long, ByVal wParam AsLong, ByVal lParam As Long) As LongDim pt As POINTAPIIf code = HC_ACTION ThenCopyMemory MouseMsg, lParam, LenB(MouseMsg)Form1.txtMsg(1).Text = "X=" + Str(MouseMsg.X) + " Y=" +Str(MouseMsg.Y)Form1.txtHwnd(1) = Format(wParam, "0")If wParam = WM_MBUTTONDOWN Then '°ÑÖмü¸ÄΪ×ó¼ümouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0CallMouseHookProc = 1End IfIf wParam = WM_MBUTTONUP Thenmouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0CallMouseHookProc = 1End IfEnd IfIf code <> 0 ThenCallMouseHookProc = CallNextHookEx(0, code, wParam, lParam)End IfEnd Function'¼üÅ̹³×ÓPublic Function CallKeyHookProc(ByVal code As Long, ByVal wParam AsLong, ByVal lParam As Long) As LongDim lKey As LongDim strKeyName As String * 255Dim strLen As LongIf code = HC_ACTION ThenCopyMemory keyMsg, lParam, LenB(keyMsg)Select Case wParamCase WM_SYSKEYDOWN, WM_KEYDOWN, WM_SYSKEYUP, WM_KEYUP:lKey = keyMsg.sKey And &HFF 'ɨÃèÂëlKey = lKey * 65536strLen = GetKeyNameText(lKey, strKeyName, 250)Form1.txtMsg(0).Text = "¼üÃû:" + Left(strKeyName, strLen) + " ÐéÄâÂë:" + Format(keyMsg.vKey And &HFF, "0") + " ɨÃèÂë:" + Format(lKey / 65536, "0")Form1.txtHwnd(0) = ""If (GetKeyState(vbKeyControl) And &H8000) ThenForm1.txtHwnd(0) = Form1.txtHwnd(0) + "Ctrl "End IfIf (keyMsg.flag And Alt_Down) <> 0 ThenForm1.txtHwnd(0) = Form1.txtHwnd(0) + "Alt "End IfIf (GetKeyState(vbKeyShift) And &H8000) ThenForm1.txtHwnd(0) = Form1.txtHwnd(0) + "Shift"End If'keyMsg.vKey And &HFF ÐéÄâÂë'lKey / 65536 ɨÃèÂëIf (keyMsg.vKey And &HFF) = vbKeyY Then '°ÑY¼üÌæ»»ÎªN If wParam = WM_SYSKEYDOWN Or wParam = WM_KEYDOWN Then keybd_event vbKeyN, 0, 0, 0End IfCallKeyHookProc = 1 'ÆÁ±Î°´¼üEnd IfEnd SelectEnd IfIf code <> 0 ThenCallKeyHookProc = CallNextHookEx(0, code, wParam, lParam)End IfEnd Function================================================================== =。