水平滚动不起作用 mouse_event(MOUSEEVENTF_HWHEEL)
Posted
技术标签:
【中文标题】水平滚动不起作用 mouse_event(MOUSEEVENTF_HWHEEL)【英文标题】:Horizontal scroll not working mouse_event(MOUSEEVENTF_HWHEEL) 【发布时间】:2011-11-28 00:04:49 【问题描述】:我在Windows 7下的Delphi 3中调用这个方法时没有水平滚动:
const MOUSEEVENTF_HWHEEL = $1000;
mouse_event(MOUSEEVENTF_HWHEEL, 0, 0, 120, 0);
MOUSEEVENTF_WHEEL
的垂直滚动效果很好。结果与SendInput
相同,返回值表示成功。我目前的鼠标支持水平倾斜,但没有水平滚动条。
使用MOUSEEVENTF_HWHEEL
需要什么?
SDK 文档:http://bit.ly/mouse_event
鼠标钩
我在 Windows 7 下创建了第二个 32 位 exe 程序,只是为了查看鼠标在水平滚轮滚动时是否发送消息。这个钩子接收 VSCROLL 但没有 HSCROLL 消息。
MouseHook := SetWindowsHookEx(WH_MOUSE_LL, @MouseProc, hInstance, 0);
【问题讨论】:
由于这似乎是 Delphi 或其他 Pascal 方言,您可能应该添加另一个标签。虽然回答 API 问题不需要该方言的特殊知识 我在讨论论坛和其他 QA 网站上搜索了几个小时......很多人都有同样的问题,使用众所周知的编程语言:VB、C 等。我很快拒绝了这个假设。但是,我在可疑列表中保留了我的 exe 标头、XML 清单、常量和函数声明。但我相信缺少另一个 X 因素。我在滚轮鼠标消息上设置了一个系统范围的窗口挂钩。检测到 VSCROLL,但 HSCROLL 挂钩是静默的。 顺便说一句:钩子是不是低级的?您能否发布您正在设置的钩子类型...? ...WH_MOUSE
或 WH_MOUSE_LL
? ...另外,由于这是一个钩子,您是在 x64 还是 x86 Windows 上运行,并且钩子 DLL 是 32 位还是 64 位...您甚至使用 DLL 吗?
钩子是一个低级鼠标,声明如下:MouseHook := SetWindowsHookEx(WH_MOUSE_LL, @MouseProc, hInstance, 0)。该程序是 Windows 7 64 位下的 32 位 exe 文件。垂直滚动事件会触发回调函数,但水平滚动事件不会触发。我希望你会看到一些可疑的东西。
好的,现在还有一件事,因为问题没有列出这些细节:您从钩子函数内部或外部调用mouse_event
以验证钩子是否有效?
【参考方案1】:
int main()
Sleep(20000); // enough time to switch windows and position the mouse pointer
mouse_event(MOUSEEVENTF_HWHEEL, 0, 0, 120, 0);
return 0;
向右滚动我选择的 Firefox 页面。必须选择窗口并且鼠标指针必须在页面上。我是在启用鼠标的情况下做到的。或者在测试时也关闭鼠标(使用鼠标本身的开/关开关),结果是一样的。 我的鼠标也有水平倾斜,没有滚动条。 (Windows 7 终极版)
编辑
需要注意的一点:程序本身需要处理消息。以 Firefox 为例。它显示与倾斜鼠标滚轮相同的行为:页面相应地向左/向右滚动。
其他程序,如 IE,似乎不处理这个消息,所以根本没有滚动。即使使用鼠标(没有任何附加软件包的罗技 Performance MX)也不会滚动。
因此,仅发送 mouse_event
消息似乎无法 100% 解决此问题。
【讨论】:
您的建议在我的代码中没有成功。我将在 C++ 中尝试一个新的空应用程序,就像你的一样。您是否有 Microsoft 鼠标(Intellipoint 驱动程序)或 Logitech 鼠标(SetPoint 驱动程序)。如果 Windows 7 还不支持 HSCROLL,则鼠标驱动程序可能会直接将 WM_HSCROLL 消息发送到滚动条... 我使用的是微软鼠标。明天将在我没有连接鼠标的笔记本电脑上尝试此代码 我和你的原始代码在 Chrome 和 Safari 中工作,但在 Internet Explorer 或 Adobe Acrobat 阅读器中不工作。仍然缺少一个小技巧。 @rjobidon 添加了一些额外的发现! +275 为您的时间 esskar!还要感谢 STATUS_ACCESS_DENIED。但是我最初的问题没有解决。我必须弄清楚鼠标倾斜和窗口水平滚动之间的消息链。然后我可以模拟鼠标驱动程序的作用。我很确定驱动程序不会保留应用程序和特定事件列表以响应 HSCROLL。以上是关于水平滚动不起作用 mouse_event(MOUSEEVENTF_HWHEEL)的主要内容,如果未能解决你的问题,请参考以下文章
ios 8 - 水平滚动视图中的按钮拦截平移事件 - 滚动不起作用