鼠标滚轮消息的捕捉

原创 2004年07月13日 12:05:00

'*************************************************************************
'**模 块 名:basMouse
'**创 建 人:叶帆
'**日    期:2002年12月31日
'**修 改 人:
'**日    期:
'**描    述:鼠标钩子
'**版    本:版本1.0
'*************************************************************************
Option Explicit
Public Type POINTL
X As Long
Y As Long
End Type
Declare Function CallWindowProc Lib "USER32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function SystemParametersInfo Lib "USER32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, lpvParam As Any, ByVal fuWinIni As Long) As Long
Declare Function ScreenToClient Lib "USER32" (ByVal hWnd As Long, xyPoint As POINTL) As Long

Public Const GWL_WNDPROC = -4
Public Const SPI_GETWHEELSCROLLLINES = 104
Public Const WM_MOUSEWHEEL = &H20A
Public WHEEL_SCROLL_LINES As Long

Global lpPrevWndProc As Long

Public sngX As Single, sngY As Single   '鼠标坐标
Public intShift As Integer              '鼠标按键
Public bWay As Boolean                  '鼠标方向
Public bMouseFlag As Boolean            '鼠标事件激活标志

'*************************************************************************
'**函 数 名:Hook
'**输    入:ByVal hWnd(Long) - 窗口句柄
'**输    出:无
'**功能描述:安装鼠标钩子
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2002年12月31日
'**修 改 人:
'**日    期:
'**版    本:版本1.0
'*************************************************************************
Public Sub Hook(ByVal hWnd As Long)
    lpPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
    '获取"控制面板"中的滚动行数值
    Call SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, WHEEL_SCROLL_LINES, 0)
End Sub

'*************************************************************************
'**函 数 名:UnHook
'**输    入:ByVal hWnd(Long) - 窗口句柄
'**输    出:无
'**功能描述:卸载鼠标钩子
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2002年12月31日
'**修 改 人:
'**日    期:
'**版    本:版本1.0
'*************************************************************************
Public Sub UnHook(ByVal hWnd As Long)
    Dim lngReturnValue As Long
    lngReturnValue = SetWindowLong(hWnd, GWL_WNDPROC, lpPrevWndProc)
End Sub

'*************************************************************************
'**函 数 名:WindowProc
'**输    入:ByVal hw(Long)     - 窗口句柄
'**        :ByVal uMsg(Long)   - 消息类型
'**        :ByVal wParam(Long) -
'**        :ByVal lParam(Long) -
'**输    出:(Long) -
'**功能描述:窗口函数
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2002年12月31日
'**修 改 人:
'**日    期:
'**版    本:版本1.0
'*************************************************************************
Private Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim pt As POINTL
    Select Case uMsg
        Case WM_MOUSEWHEEL   '滚动
            Dim wzDelta, wKeys As Integer
           
            'wzDelta传递滚轮滚动的快慢,该值小于零表示滚轮向后滚动(朝用户方向),
            '大于零表示滚轮向前滚动(朝显示器方向)
            wzDelta = HIWORD(wParam)
           
            'wKeys指出是否有CTRL=8、SHIFT=4、鼠标键(左=2、中=16、右=2、附加)按下,允许复合
            wKeys = LOWORD(wParam)
           
            'pt鼠标的坐标
            pt.X = LOWORD(lParam)
            pt.Y = HIWORD(lParam)
           
            '--------------------------------------------------
             If wzDelta < 0 Then  '朝用户方向
                bWay = True
             Else                 '朝显示器方向
                bWay = False
             End If
            '--------------------------------------------------
            '将屏幕坐标转换为Form1.窗口坐标
             ScreenToClient hw, pt
             sngX = pt.X
             sngY = pt.Y
             intShift = wKeys
            
             bMouseFlag = True  '置滚动标志
        Case Else
            WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
    End Select
End Function

'*************************************************************************
'**函 数 名:HIWORD
'**输    入:LongIn(Long) - 32位值
'**输    出:(Integer) - 32位值的低16位
'**功能描述:取出32位值的高16位
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2002年12月31日
'**修 改 人:
'**日    期:
'**版    本:版本1.0
'*************************************************************************
Public Function HIWORD(LongIn As Long) As Integer
   ' 取出32位值的高16位
     HIWORD = (LongIn And &HFFFF0000) / &H10000
End Function

'*************************************************************************
'**函 数 名:LOWORD
'**输    入:LongIn(Long) - 32位值
'**输    出:(Integer) - 32位值的低16位
'**功能描述:取出32位值的低16位
'**全局变量:
'**调用模块:
'**作    者:叶帆
'**日    期:2002年12月31日
'**修 改 人:
'**日    期:
'**版    本:版本1.0
'*************************************************************************
Public Function LOWORD(LongIn As Long) As Integer
   ' 取出32位值的低16位
     LOWORD = LongIn And &HFFFF&
End Function

 

 

鼠标滚轮消息的捕捉

2004年07月13日 12:05:00 ***************************************************************************模 块 ...
  • softart
  • softart
  • 2007年10月27日 11:59
  • 408

C#对鼠标滚轮的实现

首先在窗体构造方法,里加入这样一句话 C#代码 1.this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.pan...
  • angxiao
  • angxiao
  • 2012年05月28日 16:50
  • 3349

鼠标滚轮消息WM_MOUSEWHEEL

使用WM_MOUSEWHEEL,需要把CWnd设定为Focus。 afx_msg   BOOL   OnMouseWheel(   UINT   nFlags,   short   zDelta, ...
  • milanleon
  • milanleon
  • 2014年03月05日 15:50
  • 2246

鼠标滚轮的JS捕捉

function handle(delta) {          if (delta          {             alert('向下滚');          }   ...
  • jerry_cool
  • jerry_cool
  • 2011年01月12日 16:59
  • 379

MFC 子窗体响应鼠标滚轮消息

MFC 子窗体响应鼠标滚轮消息flyfish在父窗口重写 PreTranslateMessage BOOL CDlgX::PreTranslateMessage(MSG* pMsg) { if ...
  • flyfish1986
  • flyfish1986
  • 2017年02月16日 14:35
  • 1560

如何捕捉窗口按钮消息

如何捕捉一个未知窗口的按钮按下的消息?方法多种多样,这里我就介绍一种比较常见的方法——钩子。       原理上很简单也很容易理解,安装一个系统的全局钩子,过滤所有的系统消息,当然了,可以过滤制定的系...
  • yiyefangzhou24
  • yiyefangzhou24
  • 2011年07月24日 10:01
  • 4062

VC鼠标滚轮事件编程小结

1. 在窗口中(或对话框中)添加OnMouseWheel消息的处理,其中,第二个参数zDelta可以依据正负数自己想要的处理; 2. 上述的窗口必须获得了焦点,才会处理该消息,通常需要鼠标点击一下该...
  • dijkstar
  • dijkstar
  • 2015年06月02日 22:21
  • 3317

spy++捕捉进程消息

用spy++查看消息,通过发送消息控制程序Windows程序都是基于消息机制的,每个程序中都会有各种各样的消息,如果想通过消息来控制程序的运行,我们只用关心程序中的命令消息(WM_COMMAND)就行...
  • begtostudy
  • begtostudy
  • 2009年02月04日 16:56
  • 3593

VB模拟鼠标滚轮

用API函数mouse_event可以做到     函数及常数声明:         Public   Declare   Sub   mouse_event   Lib   "user32"   (...
  • changleqy
  • changleqy
  • 2007年07月28日 15:30
  • 2089

自定义控件加入鼠标滚轮事件

http://community.csdn.net/Expert/topic/5694/5694560.xml?temp=.9589044思路都是一样的,不过写法我不会C#,就找了一篇类似的贴上来源代...
  • lovingkiss
  • lovingkiss
  • 2007年08月06日 08:10
  • 3276
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:鼠标滚轮消息的捕捉
举报原因:
原因补充:

(最多只允许输入30个字)