| 发表于:2007-10-15 16:13:292楼 得分:0 |
创建一个工程,建一个窗体~再新建一个模块 窗体中的代码: option explicit private const wh_keyboard_ll = 13& private sub cmdexit_click() end end sub public sub hookkeyboard() keyboardhandle = setwindowshookex(wh_keyboard_ll, addressof keyboardcallback, _ app.hinstance, 0&) 'wh_keyboard_ll:拦截类型 'addressof keyboardcallback:挂接函数链的首地址 'app.hinstance:程序本身的句柄 '0,表示全局拦截,意思就是拦截所有窗口下的键盘输入 end sub private sub form_load() 'app.taskvisible = false call hookkeyboard end sub private sub form_unload(cancel as integer) call unhookkeyboard '卸载 end sub 模块中的代码: option explicit '通知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:拦截类型 lpfn:挂接函数链的首地址指针 'hmod:创建钩子函数实体的句柄,即程序本身的句柄 'dwthreadid:为监控代码,0表示全局监控,dwthreadid用于线程钩子vb中可以设置为app.threadid。 public declare function unhookwindowshookex lib "user32" (byval hhook as long) as long '释放钩子 public declare function getasynckeystate lib "user32" (byval vkey as long) as integer 'getasynckeystate作用是获得各种辅助功能键的状态(如ctrl,shift什么的) public declare sub copymemory lib "kernel32" alias "rtlmovememory" (pdest as any, _ psource as any, byval cb as long) '将内存里的某一块数据psource拷贝到另一个地址pdest,cb表示拷贝内容的字节大小 private declare function callnexthookex lib "user32" (byval hhook as long, _ byval ncode as long, byval wparam as long, _ byval lparam as long) as long '挂钩函数拦截了某条消息后,由callnexthookex决定是否将这些消息送还给windows系统 private type kbdllhookstruct '键盘钩子的结构体 vkcode as long '虚拟键码 scancode as long '扫描码 flags as long '功能键状态 time as long dwextrainfo as long end type public keyboardhandle as long '键盘钩子函数句柄 private const hc_action = 0 public const vk_f10 = &h79 '钩子函数的核心 public function keyboardcallback(byval code as long, _ byval wparam as long, byval lparam as long) as long 'code 表示拦截层次,之前我们已经说过,如果code为0,则拦截所有窗口的键盘输入 'wparam 表示是何种windows消息 'lparam表示某条windows消息的具体内容的指针,它实际指向存储那个内容的内存地址 static hookstruct as kbdllhookstruct '定义一个局部静态结构体实例 if (code = hc_action) then '鉴别windows的消息来源 call copymemory(hookstruct, byval lparam, len(hookstruct)) if (ishooked(hookstruct)) then '过滤消息 keyboardcallback = 1 exit function end if end if keyboardcallback = callnexthookex(keyboardhandle, code, wparam, lparam) '将消息释放,用callnexthookex交还给系统 end function public function ishooked(byref hookstruct as kbdllhookstruct) as boolean if keyboardhandle = 0 then ishooked = false exit function end if '有时候copymemory也会发生意想不到的事情,所以,当keyboardhandle = 0 (无值)的情况下,退出,略过该函数,以防不可预知的错误。 if (hookstruct.vkcode = vk_f10) then ishooked = true exit function end if end function public sub unhookkeyboard() '释放钩子函数 'if (hooked) then call unhookwindowshookex(keyboardhandle) 'end if end sub | | |
|