草庐IT

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

coder 2024-06-05 原文

基本上,首先,我想重现 WizMouse 的功能或 KatMouse .一个相关的 super 用户问题是 here .

我需要哪些 Windows API?

此外,作为第二步,我想到了实现 MacOSX 滚动加速和像素精确滚动等功能。 (基本上,你总是逐个像素地滚动,但是当你快速移动滚轮时,它会比线性加速,例如二次方,加速到滚轮速度。这样,你可以滚动更多更快地滚动到结束一个很长的页面,同时,您可以滚动得更少但更精确。)

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

这个问题是用 C++ 和 Winapi 标记的,但如果使用其他 Windows-API 和其他语言更容易,我也愿意接受。

最佳答案

GetCursorPos 会让你得到鼠标指针的坐标。在那之后,WindowFromPoint 会让你弄清楚那个点是哪个窗口。显然是 figuring out which window is at a given point is complicated, though ,因此您需要对不同的 ...FromPoint... API 进行一些试验(从 Old New Thing 博客文章来看,WindowFromPoint 应该为您的目的工作得很好)。

要捕获鼠标滚动消息,您需要将 SetWindowsHookExWH_MOUSE_LL 结合使用。这将向您发送所有鼠标消息。确保为 WM_MOUSEWHEELWM_HMOUSEWHEEL 以外的任何消息调用 CallNextHookEx;你不想吃掉所有的信息!不过,您确实想要使用 WM_MOUSEWHEELWM_HMOUSEWHEEL 事件,因为您是手动将它们发送到另一个窗口。

我对下一部分不太确定。我想你会想将 WM_MOUSEWHEEL 直接传递给光标下的窗口,但你需要确保你的钩子(Hook)不会吃掉它。 (完成此操作的最佳方法可能是让 Hook 过程确定 WM_MOUSEWHEEL 消息是否已传递到光标下的窗口,如果没有,则只处理/吃掉它。)你可以还可以利用消息的 wParam 来设置滚动的速度。我不相信您能够逐个像素地滚动,但您最初可以使用最小滚动距离 (WHEEL_DELTA * 1),并随着滚动速度的加快和快点。冲洗并重复 WM_HMOUSEWHEEL

您需要非常小心的一件事是超时。来自 WH_MOUSE_LL 钩子(Hook)的文档:

The hook procedure should process a message in less time than the data entry specified in the LowLevelHooksTimeout value in the following registry key: HKEY_CURRENT_USER\Control Panel\Desktop

The value is in milliseconds. If the hook procedure times out, the system passes the message to the next hook. However, on Windows 7 and later, the hook is silently removed without being called. There is no way for the application to know whether the hook is removed.

The FAQ for X-Button Mouse Control 是一款与您正在寻找的功能类似的应用程序,它说(强调我的):

When using on Windows 7, XMBC can stop responding to mouse click seemingly randomly. This is not strictly a bug in XMBC but a change in the behaviour of Windows. Windows 7 introduced the concept of a timeout for system hooks (the method XMBC uses to monitor the mouse). If the CPU is busy (eg. playing HD movies) XMBC may not be scheduled (by windows) in time to respond to the hook before this timeout occurs. When this happens, the hook is removed without notification (thanks Microsoft!) and XMBC appears to have stopped working. Restarting it or pressing Apply in the settings screen fixes the problem until it happens again.

The only solution to this is to increase the LowLevelHookTimeout value (in the registry for now).

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

关于c++ - 捕获全局鼠标滚动,并将自定义鼠标滚动事件发送到应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22476260/

有关c++ - 捕获全局鼠标滚动,并将自定义鼠标滚动事件发送到应用程序的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  5. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  6. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  7. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  8. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  9. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

  10. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

随机推荐