捕获全局鼠标滚动,并将自定义鼠标滚动事件发送到应用程序

基本上,首先,我想重现WizMouse或KatMouse的function。 相关的超级用户问题在这里 。

我需要什么Windows API?

另外,作为第二步,我想到了实现MacOSX滚动加速和像素精确滚动的function。 (基本上,你总是逐个像素地滚动,但是当你快速地移动滚轮时,它会加速到比滚动速度更快的线性,例如二次方式,这样,你可以更快更快的滚动到最后一个长的页面,同时,你可以滚动的方式越来越精确。)

有没有办法只滚动一个元素只有一个像素? (我可以自己实现所有剩下的逻辑。)

这个问题是用C ++和Winapi标记的,但是如果用其他一些Windows API和其他一些语言更容易的话,我也可以这样做。

GetCursorPos会让你获得鼠标指针的坐标。 之后, WindowFromPoint将让你找出哪个窗口在那个点上。 显然, 找出哪个窗口在给定的点是复杂的,所以你会想做一些不同的实验...FromPoint......FromPoint... API(从看旧的新事情的博文, WindowFromPoint应该只是工作罚款为您的目的)。

要捕获鼠标滚动消息,您需要使用SetWindowsHookEx 。 这将发送给你任何和所有的鼠标消息。 请确保您调用CallNextHookEx除了WM_MOUSEWHEELWM_HMOUSEWHEEL以外的任何消息; 你不想吃掉所有的信息! 你确实想吃WM_MOUSEWHEELWM_HMOUSEWHEEL事件,因为你正在手动发送它们到一个备用窗口。

我对下一部分有点不确定。 我想你会想将WM_MOUSEWHEEL直接传递给光标下的窗口,但是你需要确保你的钩子不会吃掉它。 (最好的方法是让钩子程序确定WM_MOUSEWHEEL消息是否已经传递给光标下的窗口,如果不是,则只处理/吃掉。)你也可以利用消息的wParam设置滚动的速度。 我不相信您可以逐像素地滚动,但是您可以最初使用最小的滚动距离( WHEEL_DELTA * 1 ),并且在您滚动得越来越快的时候缩放该倍数。 冲洗并重复WM_HMOUSEWHEEL

你需要非常小心的一件事就是超时。 从WH_MOUSE_LL钩子的文档:

挂钩过程应该处理消息的时间少于在以下注册表项中LowLevelHooksTimeout值中指定的数据条目:HKEY_CURRENT_USER \ Control Panel \ Desktop

该值以毫秒为单位。 如果挂钩程序超时,系统将消息传递给下一个挂钩。 但是,在Windows 7和更高版本中,挂钩将被静默移除而不被调用。 应用程序无法知道挂钩是否被移除。

X-Button鼠标控制 的常见问题解答 ,一个类似于你正在寻找的应用程序,说(强调我的):

在Windows 7上使用时,XMBC可以停止响应鼠标点击看似随机。 这不是XMBC中的严重错误,而是Windows行为的变化。 Windows 7引入了系统挂钩超时的概念(XMBC用来监视鼠标的方法)。 如果CPU繁忙(例如播放高清电影),在发生超时之前XMBC可能无法及时调度(通过windows)来响应挂机。 发生这种情况时,挂钩将被删除而不通知(谢谢微软!),XMBC似乎已经停止工作。 重新启动它或在设置屏幕中按应用,可以解决问题,直到再次发生。

唯一的解决办法是增加LowLevelHookTimeout值(现在在注册表中)。

您的软件很可能会面临同样的问题。 您需要确保自己记录和/或调整注册表项以提供更高的超时值。