我用了一个 WH_KEYBOARD 键盘钩子来拦截键盘按键信息,如果按键输入为软件定义的功能键(如F,E等),我就在钩子函数中进行相应的处理。我的MDI框架上有一个工具栏 TOOLBAR,工具栏中除了button外,我还加入了一个TextBox,现在的问题是,我想在当工具栏上的TextBox得到焦点后,键盘钩子就不应对按键进行拦截,直到失去焦点后才重新拦截。
钩子函数的拦截与否可以用一个全局Boolean变量来判断,问题就在如何知道工具栏上的TextBox得到与失去焦点,在VB中并没有相应的事件处理函数。
所以我想通过MDI窗口函数的子类化来得到GotFocus和LostFocus事件通知,但我用SPY++工具找不到工具栏上TextBox得到与失去焦点是什么消息。
不知道上面我说的够明白没有?
请各位高手给出解决的好办法!谢谢了!

解决方案 »

  1.   

    不知道你用的WH_KEYBOARD 键盘钩子提供了多少个接口,一般来将,钩子应该可以判定消息是来自哪一个控件的吧,先查找toolbar上的textbox控件的句柄,然后在程序中根据消息来源进行处理
      

  2.   

    在textbox的lostfocus中hook,getfocus中unhook。
      

  3.   

    rainstormmaster:
    一般来将,钩子应该可以判定消息是来自哪一个控件的吧.
    上面这句话我不太懂,能否说得明白点,最好给个例子。
    谢谢!
      

  4.   

    用rainstormmaster的方法可行吗?钩子能钩到消息来源?学习。
      

  5.   

    To : rainstormmaster(rainstormmaster) 
    能否给个例子让我们学习一下,谢谢
      

  6.   

    我用全局hook,记得好象是不行,但是我想用子类化应该可以的!
    它的消息应该是(wm)_setfocus和(wm)_killfocus!
    我看见你的问题,你是用win98吗?用win2000,应该是WH_KEYBOARD_ll的,我想应该是可以的,
    你再试一试,用子类化,用全局hook肯定是不行,它只能是线程所专有的,vb是不可以全局hook的,
    因为不能dll!
      

  7.   

    工具栏上的text没有得到焦点与失去焦点的事件驱动吗?
      

  8.   

    TO:efei4000(何浩然) :
    通过子类化是可以得到工具栏上TextBox的WM_SETFOCUS和WM_KILLFOCUS消息,但不能判断是不是属于TextBox控件的,因为在窗口函数WindowProc中,有hWnd,uMsg,wParam,lParam四个传递进来的参数,uMsg可以判断是否为WM_SETFOCUS和WM_KILLFOCUS,lParma在此为0,而hWnd为TextBox的句柄,可惜程序每次运行时句柄都是变化的,WPARAM为失去与获得焦点的窗口句柄,也是不可用的。所以我不能判断焦点消息的从属情况???
    关于HOOK,我用的是线程钩子,因为我的程序运行时会禁止用户切换到其它程序,所以没必要用全局HOOK,如果要用全局HOOK,就得用VC写DLL,然后VB调节来实现了。
      

  9.   

    在VB的IDE中:工具栏上的text并没有得到焦点与失去焦点的事件响应函数可用
      

  10.   

    全局HOOK,在HOOK进程中处理子类,可以做成全局的子类.
      

  11.   

    TO  jlum99(闲人) :
    "在HOOK进程中处理子类",是否可以举个例子。
      

  12.   

    我到是看到个汇编的列子,把sendmessage函数放在全局鼠标钩子的处理函数里,发现全局鼠标钩子的处理函数会放在目标进程中执行,就侵入了目标进程了.我想这样大概也能做成一个全局的子类化程序.
      

  13.   

    laolux(思想控制世界) :通过子类化是可以得到工具栏上TextBox的WM_SETFOCUS和WM_KILLFOCUS消息,但不能判断是不是属于TextBox控件的.是textbox上的消息?那应该是通知码吧,你这样呢:
    wm_command,en_setfocus And wm_command,en_killfocus
    好象是en吧,你先查一下edit类的通知码,注意是用wparam参数,它是高16位发送这些消息的,低16好象是放该控件的标号,你试试-------