我试图挂钩键盘时遇到问题(不是键盘记录器!)我试图自动化Word,然后我用一个特殊的钩子调用dll。
我有一个台式机和一个笔记本(两个有相同的防病毒+ Windows 7 x64),唯一不同的是在笔记本电脑中安装了更新版本的Windows。问题:笔记本电脑的一切工作都很精细。但在桌面上发生奇怪的事情:挂钩已经安装并且如果以记事本为目标,效果很好,但是,当针对Word时,虽然安装了挂钩,但是对外部函数的调用受到了压制!
LRESULT CALLBACK HookProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code<0) {
return CallNextHookEx(HookHandle,code,wParam,lParam);
}
bool callNextHook = true;
if (callFunction != NULL) {
// ONLY WITH WORD AND ONLY IN THE DESKTOP callFunction SEENS TO BE NULL!!!
// this is a pointer to a function in main application
callFunction(code,wParam,lParam,&callNextHook);
} else {
ShowMessage("THE UNKNOW ERROR! THIS MESSAGE IS SHOWED, THEN HOOK IS INSTALLED");
}
//Call the next hook in the chain
if (callNextHook) {
return CallNextHookEx(HookHandle,code,wParam,lParam);
}
return 0;
}
我已经尝试过禁用防病毒,更改用户帐户控制,以管理员身份运行程序......没有任何效果。造成这种差异的原因是什么?
答案 0 :(得分:1)
它可能与注册表中的LowLevelHooksTimeout值有关。
在速度更快的机器上,他们可以足够快地处理挂钩并使其在默认的200毫秒内处理超时。在较慢的机器上,它们会有更难的时间。
对于我来说,我必须将此值从默认值提升到我的应用程序涉及挂钩的500毫秒(0x1F4),以便跨机器可靠。
要查看更改此注册表值的效果,您必须重新启动计算机。
见以下文件备注中的第四段:
钩子程序应该在比数据更短的时间内处理消息 在以下LowLevelHooksTimeout值中指定的条目 注册表项:
HKEY_CURRENT_USER \ Control Panel \ Desktop
价值在 毫秒。如果挂钩过程超时,系统将通过 消息到下一个钩子。但是,在Windows 7及更高版本中,钩子是 默默地删除而不被调用。没有办法了 应用程序知道是否删除了钩子。
希望有所帮助。
答案 1 :(得分:0)
似乎是rad studio xe2中的一个bug,用xe6编译hook dll解决了这个问题。有趣的是,有了这个bug和一些额外的代码,有可能只用一个dll挂钩32和64程序。这样,我继续使用用xe2编译的旧dll。