我的程序功能是在窗体中滚动鼠标中键时,每转动一次,在窗体中的数字就加1,不过我的程序有时在捕捉时有点慢,滚动中健时数字不变化,代码如下:
公共模块:
Public 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
Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Const GWL_WNDPROC = -4&
Public Const WM_MOUSEWHEEL = &H20A
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Public Type POINTAPI
        x As Long
        y As Long
End Type
Public OldWindowProc As Long '用来保存系统默认的窗口消息处理函数的地址
Public hwndTextBox As Long  '用来保存form的句柄
Public iNum as Integer
'自定义的消息处理函数
Public Function NewWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    On Error Resume Next
    
    If Msg = WM_MOUSEWHEEL Then
        '下面得到鼠标位置处的对象的句柄
        Dim CurPoint As POINTAPI, hwndUnderCursor As Long
        GetCursorPos CurPoint
        hwndUnderCursor = WindowFromPoint(CurPoint.x, CurPoint.y)
        '如果鼠标位于Form1内部,则对鼠标滚轮事件进行处理
        If hwndUnderCursor = hwndTextBox Then
            If wParam = -7864320 Then '向下滚动
                inum=cint(form1.lblnum.caption)
                inum=inum+1
                form1.lblnum.caption=inum
            ElseIf wParam = 7864320 Then '向上滚动
                Form1.lblRightNum = CInt(Form1.lblRightNum) + 1
                inum=cint(form1.lblnum.caption)
                inum=inum-1
                form1.lblnum.caption=inum            End If
        End If
    Else
        '调用form1的默认窗口消息处理函数
        NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam)
    End If
End Function程序窗体代码:
Private Sub Form_Load()
    '取得窗体的句柄
    hwndTextBox = Form1.hwnd
    '保存默认窗口消息处理函数地址
    OldWindowProc = GetWindowLong(Form1.hwnd, GWL_WNDPROC)
    '将窗体消息处理函数指定为自定义函数NewWindowProc
    Call SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf NewWindowProc)
End Sub

解决方案 »

  1.   

    hwndTextBox 似乎还没有赋值啊
      

  2.   

    不好意思,因为源代码是取自我的程序中的小部分,其中修改部分内容,现新的代码:
    公共模块:
    Public 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
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Const GWL_WNDPROC = -4&
    Public Const WM_MOUSEWHEEL = &H20A
    Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
    Public Type POINTAPI
            x As Long
            y As Long
    End Type
    Public OldWindowProc As Long '用来保存系统默认的窗口消息处理函数的地址
    Public hwndTextBox As Long  '用来保存form的句柄
    Public iNum As Integer
    '自定义的消息处理函数
    Public Function NewWindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        On Error Resume Next
        
        If Msg = WM_MOUSEWHEEL Then
            '下面得到鼠标位置处的对象的句柄
            Dim CurPoint As POINTAPI, hwndUnderCursor As Long
            GetCursorPos CurPoint
            hwndUnderCursor = WindowFromPoint(CurPoint.x, CurPoint.y)
            '如果鼠标位于Form1内部,则对鼠标滚轮事件进行处理
            If hwndUnderCursor = hwndTextBox Then
                If wParam = -7864320 Then '向下滚动
                    iNum = CInt(Form1.lblNum.Caption)
                    iNum = iNum + 1
                    Form1.lblNum.Caption = iNum
                ElseIf wParam = 7864320 Then '向上滚动
                    
                    iNum = CInt(Form1.lblNum.Caption)
                    iNum = iNum - 1
                    Form1.lblNum.Caption = iNum            End If
            End If
        Else
            '调用form1的默认窗口消息处理函数
            NewWindowProc = CallWindowProc(OldWindowProc, hwnd, Msg, wParam, lParam)
        End If
    End Function'窗体模块:
    Private Sub Form_Load()
        lblNum.Caption = 1
        '取得窗体的句柄
        hwndTextBox = Form1.hwnd
        '保存默认窗口消息处理函数地址
        OldWindowProc = GetWindowLong(Form1.hwnd, GWL_WNDPROC)
        '将窗体消息处理函数指定为自定义函数NewWindowProc
        Call SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf NewWindowProc)
    End Sub
      

  3.   

    测试了一下,楼主的代码没有问题啊,反应很灵敏
    只不过这段代码必须用鼠标才行,用我的笔记本电脑的触摸板不行,
    原因是使用触摸板的时候,hwndUnderCursor = WindowFromPoint(CurPoint.x, CurPoint.y)返回hwndUnderCursor不是程序窗口的hwnd,通不过If hwndUnderCursor = hwndTextBox Then这句判断
      

  4.   

    因为在中键转动后,会将所获取的数值输出到PLC中,以便在自动化生产设备中检测,数值可以输出到PLC,就是转动后,获取数值时好像响应速度有点慢,这样在生产时会产生误差.
      

  5.   

    我试了下没有什么问题呀!很灵敏!
    去掉Form1.lblRightNum = CInt(Form1.lblRightNum) + 1(不知道干什么用的)
      

  6.   

    我这个源代码是修改自我的程序,只是让其简便显示出来,其实在窗体中有两个标签控件,我分别为lblleftnum和lblrightnum,当鼠标中键向下转动时,左边lblleftnum数值自动加1,向上转动时,右边lblrightnum自动加1,当每转动一次时会将数值输出到PLC中,即控件fpcomm.write 寄存器地址,需输出的数值,我想可能是FPCOMM控件向PLC写入数据时影响了程序.
      

  7.   

    WM_MOUSEWHEEL 这个消息的优先级应该比较低,系统忙的时候很可能得不到及时的响应,用在实时控制系统里面不合适。
    纯属估计,并无实据,仅供参考