不是禁用,而是让雕刻人体工学鼠标上的 Windows 按钮发送 XBUTTON2 消息(winapi 视角)

不是禁用,而是让雕刻人体工学鼠标上的 Windows 按钮发送 XBUTTON2 消息(winapi 视角)

正如预期的那样,所有鼠标上的两个额外按钮都会发送 XBUTTON1 和 XBUTTON2 消息。但是,使用 Sculpt 人体工学鼠标时,Windows 按钮不会发送此消息。显然,它发送了正确的 Windows 键。我需要修复它,以便它发送 XBUTTON2。

我可以按照以下步骤禁用 Windows 按钮执行任何操作:重新绑定 Microsoft Sculpt 移动鼠标(Windows 键)- 但这会完全禁用鼠标上的 Windows 按钮,并且不会使其像其他五键鼠标一样正常工作。它应该发送XBUTTON2

但是我需要它作为XBUTTON2发挥作用。

以下是详细解释:

我是一名软件开发人员。我购买了 Sculpt 人体工学鼠标,因为它有五个按钮(和水平滚动条),因此我可以测试所有按钮消息。它特别有助于让我在打字/鼠标离开时保持舒适。

鼠标钩子的按钮消息如下:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644986.aspx

mouseData 字段根据鼠标按钮进行设置:

下面是一张解释这些要点的图表:

在此处输入图片描述

绿色箭头和文本云显示情况就是这样,这也是我所期望的。红色箭头和文本云是我期望 Windows 鼠标按钮执行的操作,但事实并非如此。有人能帮助我让这个 Windows 鼠标按钮从 winapi 的角度按预期工作吗?

答案1

听“WIN”键

据我所知,您可能看不到来自“WIN”鼠标键的任何事件的唯一原因是您只查看与鼠标相关的事件,而“WIN”键会产生与键盘相关的“Right-Win”击键。实际上,这部分已经在评论中讨论– “Right-Win” 重新映射完美运行。

重复发送 RWin 事件

我可以确认它会重复发送事件。据我所知,每个键盘键都是这样工作的——例如“F2”。至少以下德国工商会 诡计据我所知,“F2”和“RWin”显示的效果实际上相同。

#InstallKeybdHook
#InstallMouseHook
1::KeyHistory 

“WIN”键的好处在于它机械地能够产生单个按键。与滚轮倾斜相比,很难从它们获得“单击”效果,即使我最短的单击通常也会被视为 3-5 个单独的按键。

聆听方向盘倾斜键

“Microsoft 鼠标和键盘中心”(版本 2.7.133.0)似乎改变了鼠标的行为 - AHK 不再能够听到 WheelRight/WheelLeft 事件。解决这个问题最简单的方法就是卸载微软的工具,不过根据我的实验,这个方法对WIN键没有影响。

但是,即使不卸载它,仍然可以重新映射方向盘倾斜度。通过使用安康爱康示例 1 和 2 我能够使用 UsagePage 12、安装了“Microsoft 鼠标和键盘中心”的 Usage 1 从右轮和左轮倾斜中捕获 1FFDFF 和 1F0300“数据”,卸载后什么也没有。

重复发送车轮倾斜事件

就我个人而言,我最终只是引入了延迟,因为Bob 建议。它看起来是最简单的代码,基于这个问题在这种情况下,它可以正常工作(尽管它可能不是最佳的 - 我不是 AHK 专家)。以下 AHK 脚本允许我将 Wheel-tilt-Left 重新映射到“Ctrl+Alt+leftArrow”,将 Wheel-tilt-Right 重新映射到“Ctrl+Alt+rightArrow”。我使用这些热键虚拟主机切换到上一个/下一个虚拟桌面(这项任务中,“每次点击一个响应”非常重要),它运行完美。(不过,如果我按住“倾斜按钮”,每秒会收到约 5 个事件)。

WheelRight::
    if(  not GetKeyState("WheelRight")  )
        sleep 200    

    Send, {LControl down}
    Send, {LAlt down}
    Send, {right}
    Send, {LControl up}
    Send, {LAlt up} 
return


WheelLeft::     
    if(  not GetKeyState("WheelLeft")  )
        sleep 200

    Send, {LControl down}
    Send, {LAlt down}
    Send, {left}
    Send, {LControl up}
    Send, {LAlt up}
return        


RWin:: 
    Send, {Browser_Forward}
return

即使没有这个技巧,RWin 也可以正常工作。

答案2

计时器非常适合将重复事件简化为单个操作。每次我们收到重复的按键/点击时,我们都会重置计时器间隔,因此直到我们最终释放按键/按钮时,操作才会发生。

我使用这个脚本来实现车轮倾斜:

; Prevent warning if we hold a button too long
#MaxHotkeysPerInterval 200

~MButton & WheelRight::
    SetTimer ArrangeWindowRight, -50
return

~MButton & WheelLeft::
    SetTimer ArrangeWindowLeft, -50
return

ArrangeWindowRight:
    Send #{Right}
return

ArrangeWindowLeft:
    Send #{Left}
return

因此 ArrangeWindowRight 和 ArrangeWindowLeft 仅被调用 50ms我释放了倾斜(请注意计时器间隔中的负号,以便它只运行一次;如果没有它,该函数将被一次又一次地调用)。

至于 i3v 的代码,乍一看,我觉得它所做的只是减慢最后的重复事件(sleep 200 if wheel is not pressed anymore),所以我想知道那里有什么改进。此外,您可以将五次发送减少到Send ^!{Right}

干杯!

相关内容