VK_LEFT都能捕获,为什么内容改变的EN_CHANGE不能捕获,google baidu了一天没找到结果,望大家能帮忙。如果能把问题分析透彻是最好的,先谢过了!代码如下:Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
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 SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_USER = &H400
Public Const GWL_WNDPROC = (-4)
Private OldWndProc As Long
Public Const VK_UP = &H101
Public Const VK_DOWN = &H100
Private Const VK_LEFT = &H25
Public Const EN_CHANGE = &H300
Private Const ENM_CHANGE = &H1
  Private Const ENM_SELCHANGE = &H80000
Public Function WindowProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'    Debug.Print Msg, wParam, lParam
    Select Case wParam
    Case EN_CHANGE
        Debug.Print "EN_CHANGE"
    Case VK_LEFT
        Debug.Print "VK_LEFT"
    Case Else
        ' If Msg = WM_MYMESSAGE Then
        ' Debug.Print "自定义消息!"
        ' Exit Function
        ' End If
    WindowProc = CallWindowProc(OldWndProc, hWnd, Msg, wParam, lParam)
    End Select
End Function
Public Sub HookWindow(hWnd As Long)
    OldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnHook(hWnd As Long)
    SetWindowLong hWnd, GWL_WNDPROC, OldWndProc
End Sub------------------------Option ExplicitPrivate Sub Form_load()
    Call HookWindow(Text1.hWnd)
End SubPrivate Sub Form_Unload(Cancel As Integer)
    Call UnHook(Text1.hWnd)
End Sub

解决方案 »

  1.   

    理论上说是可以的,不知道为什么实际上就不出来呢?
    等高手来解决了,帮你顶
    下面是常用消息
    供高手参考
    下表列出了文本控件的常用通知消息:消息名称 消息说明
    EN_CHANGE 编辑控件的内容一旦发生改变,就发送这条消息。
    EN_ERRSPACE 任何时候只要由于内存不足以完成一项编辑操作,就发送这条消息。
    EN_HSCROLL 只要用户单击了从属于一个编辑控件的水平滚动条的任何地方,就会发送这条消息。注意这条消息是在控件更新显示之前发送出去的。
    EN_KILLFOCUS 一旦控件丢失了输入焦点,则发出这条消息。
    EN_MAXTEXT 只要用户输人的文字试图超出由EM_LIMITTEXT消息规定购界限,或试图超出由VB Maxlength属性规定的界限,就会发送这条消息。此外,倘若不允许自动进行水平滚动,同时插入点要超出控件的宽度;或者不允许自动自动滚动,同时插入点要超出接件的高度,那么也会触发这条消息。
    EN_SETFOCUS 一旦控件接收到了输入焦点,就发出这条消息。
    EN_UPDATE 这条消息在控件显示出已改变的文字之前发出。它与EN_CHANGE通知消息相似,只是它发生于更新文本显示出来之前。
    EN_VSCROLL 只要用户单击了从属于一个编辑控件的垂直滚动条的任何地方,就会发送这条消息。注意这条消息是在控件更新显示之前发送出去的。
      

  2.   

    API不熟,弱问一句,EN_CHANGE这种东西不是应该配合WM_COMMAND发给主窗体吗?
    我觉得应该在Form的WindowProc里面拦截它