为什么80%的码农都做不了架构师?>>>   

本文地址:http://blog.csdn.net/useway 《Java程序员,上班那点事儿》

——作者:钟声
VB一直被认为是一个可以通过简单的方法,完成Windows界面应用程序的一个语言。对Windows系统方面的编程似乎首先想到的绝对不是VB,而大部分程序员想到的一定是VC。我们今天就介绍一种用VB截获Windows全局消息的方法。
    一、Windows全局消息介绍
我不喜欢用非常晦涩的语言来介绍一个简单的事物,因此,我想在本篇文章中就用通俗的语言来解释这个概念吧。
什么是Windows全局消息呢?
例如:鼠标在自定义的窗口中移动的位置,我们可以通过这个Form中的相关方法获取,然而,如果鼠标并没有在自己的Form中移动又该怎么获得其位置呢?
再例如:键盘的敲击动作,在别的地方敲击键盘,并没有在自己的Form中敲击键盘,怎么才能获得按键的具体键值呢?
对单片机有了解的朋友都知道,鼠标和键盘的操作都是利用的是“中断”触发事件来完成的,那么当系统“中断”的时候,就会发出消息给操作系统,而这些消息就是Windows全局消息。
    二、钩子简介
钩子是通过英文Hook翻译过来的,所谓的钩子就是在Windows全局消息传递到操作系统之前进行截获,经过处理后再传递给操作系统或者其他钩子的程序。
想想看,钩子听起来像什么程序?
对没错,黑客程序,木马程序,都是通过钩子的方法获取鼠标键盘的相应操作信息,还获取密码或其他有用信息的。
但是,钩子其本身并不是病毒,而是提供给我们程序员一种获取操作系统动作的一个方法,这个方法有时候非常有用,可以非常方便的开发针对操作系统的优质程序。
    三、消息种类
1、WH_CALLWNDPROC和WH_CALLWNDPROCRET
这两种消息是发送到窗口过程的消息,系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC,并且在窗口过程处理完消息之后调用WH_CALLWNDPRO 。
2、WH_CBT   
它是激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;
完成系统指令;来自系统消息队列中的移动鼠标,键盘事件;
设置输入焦点事件;同步系统消息队列事件。
3、WH_KEYBOARD
WM_KEYDOWN     监视     WM_KEYUP
4、WH_KEYBOARD_LL
监视输入到线程消息队列中的键盘消息
5、WH_MOUSE
监视输入到消息队列中的鼠标消息
6、WH_MOUSE_LL
监视输入到线程消息队列中的鼠标消息

    四、钩子类型
1)    线程钩子:监视指定线程的事件消息。    
    2)    系统钩子:监视系统中的所有线程的事件消息。
VB只能设定线程钩子,因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL)中才能做到。
   五、VB建立钩子的方法步骤
   步骤1:挂钩
挂钩是第一步,目的是1,告诉操作系统我要监听什么消息,2是告诉操作系统得到消息后调用什么回调函数。
挂钩的方法:
例如:
Private Const WH_MOUSE_LL As Long = 14
Private hHook As Long
......
hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)

第一个参数:告诉操作系统,我要挂的是一个鼠标监听钩子。
第二个参数:告诉操作系统,我的回调函数是HookProc,AddressOf的作用是得到HookProc这个函数的地址。
   步骤二:回调函数的编写
Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
    Dim typMHS As MSLLHOOKSTRUCT, pt As POINTAPI
If wParam = WM_MOUSEMOVE Then
        Call CopyMemory(typMHS, ByVal lparam, LenB(typMHS))
        pt = typMHS.pt
        'If PtInRect(hRT, pt.x, pt.y) <> 0 Then
        '    HookProc = 1 '取消原本要完成的動作
        'Else
            Form1.Caption = "mouse Cursor at " + CStr(pt.x) + "," + CStr(pt.y)
            HookProc = 0 '令待完成的動作繼續完成
        'End If
    End If
   
    If wParam = WM_LBUTTONDOWN Then
       Debug.Print "l"
    End If
   
    If wParam = WM_RBUTTONDOWN Then
       Debug.Print "r"
    End If
   
    'If nCode < 0 Then
       HookProc = CallNextHookEx(hHook, nCode, wParam, lparam)
    '   Exit Function
    'End If
   
End Function

注意一:回调函数的格式
Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
nCode:钩子的句柄
     wParam,lParam:包含了拦截到的消息内容,同样它也与Hook的种类和nCode的值不同而不同。比如在键盘钩子(KeyBoard)中,wParam则是按键返回码。如果是鼠标事件,那么包含的鼠标的位置信息和按键信息。
注意二:在回调函数结束的时候,需要增加一个CallNextHookEx把消息再传递给下一个钩子或者操作系统。
这个也很好理解,你截获消息以后,并不是要把这个消息真的截获,而只是想进行相应处理,然后再把消息传递给下一个接棒者。
    步骤三:释放钩子
在程序结束后,需要把钩子摘掉,否则,一直会监听系统的消息。
Call UnhookWindowsHookEx(hHook)
    六、完整的VB钩子程序
模块代码:
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length 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 Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lparam As Any) As Long
Private Const HC_ACTION = 0
Private Const WH_MOUSE_LL As Long = 14
Private Const WM_MOUSEMOVE = &H200
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_MBUTTONDOWN = &H207
Private Const WM_MBUTTONUP = &H208
Private Const WM_MBUTTONDBLCLK = &H209
Private Const WM_MOUSEACTIVATE = &H21
Private Const WM_MOUSEFIRST = &H200
Private Const WM_MOUSELAST = &H209
Private Const WM_MOUSEWHEEL = &H20A   '以上是鼠标的各个值
Private Type POINTAPI
   x As Long
   y As Long
End Type
Private Type MSLLHOOKSTRUCT
    pt As POINTAPI
    mouseData As Long
    Flags As Long
    time As Long
    dwExtraInfo As Long
End Type
Public hHook As Long
Public Sub EnableHook()
    If hHook = 0 Then
       hHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf HookProc, App.hInstance, 0)
    End If
End Sub
Public Sub FreeHook()
    If hHook <> 0 Then
       Call UnhookWindowsHookEx(hHook)
       hHook = 0
    End If
End Sub
Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
    Dim typMHS As MSLLHOOKSTRUCT, pt As POINTAPI
If wParam = WM_MOUSEMOVE Then
        Call CopyMemory(typMHS, ByVal lparam, LenB(typMHS))
        pt = typMHS.pt
        Debug.Print "mouse Cursor at " + CStr(pt.x) + "," + CStr(pt.y)
    End If
   
    If wParam = WM_LBUTTONDOWN Then
       Debug.Print "l"
    End If
   
    If wParam = WM_RBUTTONDOWN Then
       Debug.Print "r"
    End If
   
    HookProc = CallNextHookEx(hHook, nCode, wParam, lparam)
 
End Function

 

窗口代码:
Private Sub Form_Load()
    EnableHook
End Sub
Private Sub Form_Unload(Cancel As Integer)
    FreeHook
End Sub

原文链接: http://blog.csdn.net/useway/article/details/4358169

转载于:https://my.oschina.net/dtec/blog/44948

VB无所不能之三:VB截获Windows消息的钩子相关推荐

  1. c#中通过截获windows消息禁止改变窗体大小

    private const int WM_SYSCOMMAND = 0x112;         private const int MF_REMOVE = 0x1000;         priva ...

  2. VB无所不能之五:建立“标准”DLL动态链接库文件(1)

    VB无所不能之五:建立"标准"DLL动态链接库文件(1) --作者:钟声 博客地址:http://useway.blog.51cto.com 动态链接库经常被认为是VC或者Deph ...

  3. VB为自己的程序设定消息(可接收处理)

    VB为自己的程序设定消息(可接收处理) Posted by JiaJia 5 March,2009 (0)Comment 用API函数 SetWindowLong 指定处理消息的窗口过程为自定义的函数 ...

  4. VB无所不能之七:VB的多线程(2)

    云查杀很牛X的金山毒霸!免费啦!2011下载链接! 久违啦,我今天终于又可以写博客了,VB无所不能这个系列写作途中总是磕磕绊绊的,终于写到第七篇多线程的时候,中断了长达1个多月的时间没有更新新帖,对大 ...

  5. VB无所不能之二:利用GDI+处理图像格式转换

    VB无所不能之二:利用GDI+处理图像格式转换 --作者:钟声 我今天想再续写一篇关于VB的有关文件格式转换的文章. 对于Windows编程来说,除了处理网络协议以外,处理几种类型的文件格式更加重要, ...

  6. VB实现向窗口发送按键消息

    VB实现向窗口发送按键消息 : 嵌入式模拟键盘 待解决问题 vb WM_KEYDOWN 参数设置???? id="question_content">Private Decl ...

  7. Windows 消息大全

    高级语言程序的汇编解析 在高级语言中,如C和PASCAL等等,我们不再直接对硬件资源进行操作,而是面向于问题的解决,这主要体现在数据抽象化和程序的结构化.例如我们用变量名来存取数据,而不再关心这个数据 ...

  8. 大漠找图算法_GitHub - jozhn/op: op插件(类似大漠插件),Windows消息模拟,gdi,dx,opengl截图,找图,找字(OCR),其他实用算法...

    Overview OP(operator & open)是一个开源插件(类似大漠插件).主要特点:Windows消息模拟,后台截图,找图,字符识别(OCR),以及其他实用功能...使用c++编 ...

  9. Windows消息机制详解

    消息是指什么?      消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用 ...

最新文章

  1. javascritp笔记1
  2. linux系统调用和库函数调用的区别
  3. 中法线如何反转_凹凸贴图、法线贴图、置换贴图傻傻分不清?
  4. ASP.NET十分有用的页面间传值方法(转)
  5. sql倒序查询语句_SQL丨1.基本查询语句复习
  6. Java 面向对象编程的三大特性——封装、继承、多态
  7. react ui框架_Web开发 React 学习(二十)连载基础篇大结局
  8. WordPress: 使用 wp_insert_attachment 上传附件
  9. 基于JAVASCRIPT操作XML的无刷新分页
  10. java.lang.IllegalArgumentException: name MUST NOT NULL! at org.nutz.dao.impl.NutDao.fetch
  11. Android UI学习之SeekBar
  12. Linux输入输出重定向和文件查找值grep命令
  13. 算法导论学习--学习笔记0527
  14. linux服务器生成密钥后无法登陆,securecrt用密钥安全登陆服务器
  15. 新版阿里云服务器的安全组配置
  16. Farkas'Lemma 和 S-Lemma
  17. IOS下localstorage不起作用提示
  18. 曾国藩《挺经》卷七英才
  19. 看完,感触很多 “IT技术开发人员获得成功的六大步骤”
  20. UNI-APP_uni-ap自动获取状态栏高度,自定义导航栏组件

热门文章

  1. VS_自动添加头文件
  2. 推荐系统之基于邻域的算法-------协同过滤算法
  3. android studio快捷键大全
  4. supersr--时间显示逻辑--NSDate+NSCalendar
  5. 初中英语八下单词表(SuperMemo QA文本格式)
  6. 【转载】Python 深入浅出支持向量机(SVM)算法
  7. 数独高阶技巧入门之四:简单异数链
  8. [BZOJ 5093]图的价值
  9. node 常见的一些系统问题
  10. [转]Javascript 闭包