难题:子线程中安装全局键盘钩子出现异常,主线程中安装一切正常
问题:子线程中安装全局键盘钩子出现异常,主线程中安装一切正常
说明:全钩子在dll中安装,在主线程里调用,功能正常。但如果创建子线程,在子线程里加载dll并安装钩子,发现:只能导致按键缓慢,却并不能拦截键盘消息。
奇怪:经跟踪,钩子安装是成功的,但相应消息无法在DLL里的相应KeyboardProc里截获。
凑合:可以在子线程里发送消息到主线程,然后在主线程里安装钩子。虽然可以解决,但不是我的本意。我想实现在子线程里成功安装钩子。
类似:有些其他功能,比如MCI系列函数,在子线程里也会出现些异常,比如无法获取音乐长度等。
为何子线程里会出现这些奇怪的问题呢?又应该如何解决呢?
[解决办法]
我感觉应该是函数的偏移地址不对
[解决办法]
理论是应该是完全可以的。
但你要注意线程之间是否牵涉到同步互斥问题;
在钩子过程函数里,要注意将必要消息传递下去。
[解决办法]
我提供些小线索:
· 回调函数是 __stdcall 没?
· 如果链接了CRT,是用_beginthreadex创建的线程没?
这两个错误我都犯过。
[解决办法]
你可以先将主线程的钩子干掉,看子线程中的钩子是否起作用。
再有钩子是后加入的先获得控制权, 是不是被后来加入的拦截了?
[解决办法]
子线程是否已经结束了?子线程应该有个循环防止退出,并且还应该留出时间使系统有可能调用回调函数。
[解决办法]
那就顶起来吧