【问题标题】:Horizontal scroll not working mouse_event(MOUSEEVENTF_HWHEEL)水平滚动不起作用 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_MOUSEWH_MOUSE_LL? ...另外,由于这是一个钩子,您是在 x64 还是 x86 Windows 上运行,并且钩子 DLL 是 32 位还是 64 位...您甚至使用 DLL 吗?
  • 钩子是一个低级鼠标,声明如下:MouseHook := SetWindowsHookEx(WH_MOUSE_LL, @MouseProc, hInstance, 0)。该程序是 Windows 7 64 位下的 32 位 exe 文件。垂直滚动事件会触发回调函数,但水平滚动事件不会触发。我希望你会看到一些可疑的东西。
  • 好的,现在还有一件事,因为问题没有列出这些细节:您从钩子函数内部或外部调用mouse_event 以验证钩子是否有效?

标签: windows winapi setwindowshookex


【解决方案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 或 Adob​​e Acrobat 阅读器中不工作。仍然缺少一个小技巧。
  • @rjobidon 添加了一些额外的发现!
  • +275 为您的时间 esskar!还要感谢 STATUS_ACCESS_DENIED。但是我最初的问题没有解决。我必须弄清楚鼠标倾斜和窗口水平滚动之间的消息链。然后我可以模拟鼠标驱动程序的作用。我很确定驱动程序不会保留应用程序和特定事件列表以响应 HSCROLL。
猜你喜欢
  • 2017-01-07
  • 2013-06-29
  • 2012-08-13
  • 1970-01-01
  • 2013-11-11
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多