我用了一个 WH_KEYBOARD 键盘钩子来拦截键盘按键信息,如果按键输入为软件定义的功能键(如F,E等),我就在钩子函数中进行相应的处理。我的MDI框架上有一个工具栏 TOOLBAR,工具栏中除了button外,我还加入了一个TextBox,现在的问题是,我想在当工具栏上的TextBox得到焦点后,键盘钩子就不应对按键进行拦截,直到失去焦点后才重新拦截。
钩子函数的拦截与否可以用一个全局Boolean变量来判断,问题就在如何知道工具栏上的TextBox得到与失去焦点,在VB中并没有相应的事件处理函数。
所以我想通过MDI窗口函数的子类化来得到GotFocus和LostFocus事件通知,但我用SPY++工具找不到工具栏上TextBox得到与失去焦点是什么消息。
不知道上面我说的够明白没有?
请各位高手给出解决的好办法!谢谢了!
钩子函数的拦截与否可以用一个全局Boolean变量来判断,问题就在如何知道工具栏上的TextBox得到与失去焦点,在VB中并没有相应的事件处理函数。
所以我想通过MDI窗口函数的子类化来得到GotFocus和LostFocus事件通知,但我用SPY++工具找不到工具栏上TextBox得到与失去焦点是什么消息。
不知道上面我说的够明白没有?
请各位高手给出解决的好办法!谢谢了!
一般来将,钩子应该可以判定消息是来自哪一个控件的吧.
上面这句话我不太懂,能否说得明白点,最好给个例子。
谢谢!
能否给个例子让我们学习一下,谢谢
它的消息应该是(wm)_setfocus和(wm)_killfocus!
我看见你的问题,你是用win98吗?用win2000,应该是WH_KEYBOARD_ll的,我想应该是可以的,
你再试一试,用子类化,用全局hook肯定是不行,它只能是线程所专有的,vb是不可以全局hook的,
因为不能dll!
通过子类化是可以得到工具栏上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调节来实现了。
"在HOOK进程中处理子类",是否可以举个例子。
wm_command,en_setfocus And wm_command,en_killfocus
好象是en吧,你先查一下edit类的通知码,注意是用wparam参数,它是高16位发送这些消息的,低16好象是放该控件的标号,你试试-------