用了HOOK,程序变得极不稳定,甚至不能设置断点,如设置断点调试,VB到断点处就死掉,没有任何提示直接关闭了。是何原因?我的HOOK代码为了使DATAGRIG能支持鼠标中滚,如下代码?希望专家指出不当之处。Option Explicit
'Public DATAGRID_P As DataGrid
Private Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private 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 LongPrivate Const GWL_WNDPROC As Long = (-4)
Private Const WM_MOUSEWHEEL As Long = &H20A'-- Private Variables:
Private m_OldWindowProc As LongPublic Sub Hook_P(ByVal hwnd As Long)
'-- New Window proc.
m_OldWindowProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf pvWindowProc)End Sub
Private Function pvWindowProc(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongSelect Case wMsg    Case WM_MOUSEWHEEL            Select Case wParam
                Case Is > 0
                    SendKeys "{Up}"
                Case Else
                    SendKeys "{Down}"
            End Select
        
    End Select
pvWindowProc = CallWindowProc(m_OldWindowProc, hwnd, wMsg, wParam, lParam)
End Function
  Public Sub UnHook_P(ByVal hwnd As Long)          Dim lngReturnValue As Long          lngReturnValue = SetWindowLong(hwnd, GWL_WNDPROC, m_OldWindowProc)
  End Sub
'==================调用===============
Private Sub Form_Load()
    Hook_P Me.hwnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
    UnHook_P Me.hwnd
End Sub

解决方案 »

  1.   

    不关Hook的事情挂掉IDE是因为你的这句代码:
    m_OldWindowProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf pvWindowProc)
    你用上面的代码导出了WinProc到pvWindowProc函数中,也就是说,你把窗体的消息流(姑且这么叫)导出到了pvWindowProc当你设置断点的时候,IDE传给pvWindowProc一个0的值到wMsg 这个参数中,而函数收到了这个值后返还给程序原本的WinProc,由于你的程序在IDE调试,程序的父窗口就是IDE窗口,而wMsg是零意味着挂起该窗口所以你的IDE就没有响应了
      

  2.   

    恩恩说得很明白了hook不能下断点不过用sendkeys 好像不是非常好吧
      

  3.   

    VirtualDesktop(吴工) 您的意思是在调试才会挂,实际应用应该不会挂是吗?
      

  4.   

    不过有莫名奇妙的非法操作,发送给microsoft吗?是/否,这样.
    这个错误发生的时候我还没有启动工程,只是在设计时切换form就发生了.
    应该不是编程环境问题,没有用hook之前没有过这样的错误,用了hook发生这个错误频率很高.
      

  5.   

    没有启动工程,也不会到sendkeys这步,可能和sendkeys没什么关系.