如题,Form_KeyPreview()不能对付,按钮以及列表框之类的东西会拦截方向键的消息。请大家帮忙。

解决方案 »

  1.   

    可以将 TABSTOP 属性设为 FALSE 试试。
      

  2.   

    在模块中:Option Explicit
    '-----------------------------------------------
    ' modHook.bas 由站长亲自编写的一个最简单的Hook程
    ' 序,只需要在WinProc过程中的Select Case语句中加
    ' 入需要拦截的Windows消息,以及你需要完成操作的代
    ' 码,就可以实现你的Hook程序。
    '
    ' 由任何疑问请Email:    [email protected]
    '-----------------------------------------------
    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 LongPublic Const GWL_WNDPROC = (-4)
    Public Const WM_SETFOCUS = &H7Private OldProc&
    Private mhWnd&'==================================================
    '回调
    Function WinProc&(ByVal hWnd&, ByVal wMsg&, _
                      ByVal wParam&, ByVal lParam&)
                      
        Select Case wMsg
            Case WM_SETFOCUS
                Exit Function
        End Select
        
        WinProc& = CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam)
    End Function
    '==================================================
    '==================================================
    '挂钩
    Sub Hook(ByVal nhWnd&)    If OldProc <> 0 Then Exit Sub
        
        mhWnd& = nhWnd&
        
        OldProc = SetWindowLong(nhWnd&, GWL_WNDPROC, AddressOf WinProc)End Sub
    '==================================================
    '==================================================
    '脱钩
    Sub UnHook()    If OldProc = 0 Then Exit Sub    SetWindowLong mhWnd, GWL_WNDPROC, OldProc
        OldProc = 0
    End Sub
    '==================================================
    在窗口中:Option ExplicitPrivate Sub Form_Load()
        Hook cmdNoFocus.hWnd
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        UnHook
    End Sub
      

  3.   

    这个是对付按钮聚焦框的,而且我只会挂钩一个对象,多几个就好像不行(只有一个有作用)。另外,点击了这个挂钩的按钮,方向键似乎仍然被按钮拦截着,form_keyDown 事件里,方向键没反应了。
        本人为这个问题已经开了二个100分的帖了,问题一解决,二帖的分数都给解决者。望高手不吝赐教。
    http://community.csdn.net/Expert/topic/4240/4240265.xml?temp=8.73965E-03
      

  4.   

    解决的办法就是上面的消息挂钩,但你使用有点不当,应该是在按钮获得焦点后才挂上去,在失去焦点后脱钩,而且拦截的应该是KEYDOWN、KEYUP消息,并加上判断是否方向键是的话直接EXITFUNCTION,否则就交给原来的处理程序。