禁用/重新映射 Logitech G400 鼠标 DPI 按钮

禁用/重新映射 Logitech G400 鼠标 DPI 按钮

我有一个 Logitech MX-518 鼠标,但它一直存在响应问题,因此我打电话给支持部门要求更换。他们没有给我寄另一款 518,而是寄了一个罗技 G400 鼠标因为 518 已经停产。这会导致问题,因为虽然 MX518 受洛莫科,不支持 G400 鼠标。运行$ lomoco -s显示001.003: 046d:c245 Unsupported Logitech device: Unknown

我想要做的是将鼠标的 DPI 锁定为单个值,并将 DPI+ 和 DPI- 按钮重新映射PgUpPgDn键盘上。

我该如何实现这个目标?

罗技 G400

这些按钮依次为:

  1. 按钮 1:左键单击
  2. 按钮 2:单击鼠标中键
  3. 按钮 3: 右键点击
  4. 按钮 4:鼠标滚轮向上
  5. 按钮 5:鼠标滚轮向下
  6. 按钮 6: 没有任何
  7. 按钮 7: 没有任何
  8. 按钮 8:拇指按钮 #1
  9. 按钮 9:拇指按钮 #2
  10. 按钮 10:任务切换按钮
  11. 按钮 11: 没有任何
  12. 按钮 12: 没有任何

在上一款鼠标(MX 518)上,按钮 11 和 12 是 DPI 键。这些按钮与其他按钮不同的一个原因是,xev默认情况下,诸如 之类的应用程序不会将按下这些按钮识别为事件。在 MX 518 鼠标上,为了使这些按钮能够被更改/绑定,必须先禁用它们。我相信它lomoco被称为“Logitech SmartScroll / Cruise Control”。在 G400 上,lomoco不起作用,我不知道有其他替代方案。

此外,这里是一些输出xinput,希望它有用。

user@localhost:~$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech Gaming Mouse G400                id=8    [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Power Button                              id=7    [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]
user@localhost:~$ xinput list-props 8
Device 'Logitech Gaming Mouse G400':
    Device Enabled (121):   1
    Coordinate Transformation Matrix (123): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    Device Accel Profile (248): 0
    Device Accel Constant Deceleration (249):   2.000000
    Device Accel Adaptive Deceleration (250):   1.000000
    Device Accel Velocity Scaling (251):    1.000000
    Device Product ID (238):    1133, 49733
    Device Node (239):  "/dev/input/event4"
    Evdev Axis Inversion (252): 0, 0
    Evdev Axes Swap (254):  0
    Axis Labels (255):  "Rel X" (131), "Rel Y" (132), "Rel Vert Wheel" (247)
    Button Labels (256):    "Button Left" (124), "Button Middle" (125), "Button Right" (126), "Button Wheel Up" (127), "Button Wheel Down" (128), "Button Horiz Wheel Left" (129), "Button Horiz Wheel Right" (130), "Button Side" (242), "Button Extra" (243), "Button Forward" (244), "Button Back" (245), "Button Task" (246), "Button Unknown" (241), "Button Unknown" (241), "Button Unknown" (241), "Button Unknown" (241)
    Evdev Middle Button Emulation (257):    0
    Evdev Middle Button Timeout (258):  50
    Evdev Third Button Emulation (259): 0
    Evdev Third Button Emulation Timeout (260): 1000
    Evdev Third Button Emulation Button (261):  3
    Evdev Third Button Emulation Threshold (262):   20
    Evdev Wheel Emulation (263):    0
    Evdev Wheel Emulation Axes (264):   0, 0, 4, 5
    Evdev Wheel Emulation Inertia (265):    10
    Evdev Wheel Emulation Timeout (266):    200
    Evdev Wheel Emulation Button (267): 4
    Evdev Drag Lock Buttons (268):  0

答案1

@Koviko - 我有一个类似的鼠标 - Logitech MX1100 - 它也具有 DPI 按钮,在默认模式下按下时不会发送到 USB。我自己做了一些测试,最终能够找出发送信号以将鼠标切换到“驱动程序模式”的代码,然后我可以使用 easygestures/xev 重新分配按钮。

如果您愿意,我可以引导您完成我用来确定如何关闭它的步骤(我现在有一个脚本,只需在启动时运行,这是一个非常黑客的解决方法,但至少它是有效的),但它涉及设置虚拟机和拥有辅助鼠标并嗅探原始 USB 流量,不幸的是,这似乎很可能与鼠标有关。

我的步骤(几乎肯定存在更好的步骤):

1) 在系统上安装 Windows VM(安装了 Logitech SetPoint 软件;我使用了 VirtualBox,因为我已经在 WinXP 上安装了它)、Wireshark 和 gcc。2) 然后我在终端中运行了以下步骤:

sudo modprobe usbmon
sudo wireshark &
sudo /usr/lib/virtualbox/VirtualBox &

3) 在 Wireshark 中,选择“列出可用的捕获接口...”,并记下当您移动鼠标时哪个 USB 总线号会产生大量数据包(我的是 usbmon3,但我想这纯粹取决于您的接收器插入了哪个 USB 端口)。

3) 在 VirtualBox 中(我需要以 sudo 身份运行才能共享 USB 控制器),我编辑了 XP VM 的设置,并启用了 USB 控制器和 USB 2.0 (EHCI) 控制器。然后,我添加了一个从现有设备填充的新 USB 过滤器,并选择了我的 Logitech 鼠标接收器(供应商 ID 046d,产品 c245,供您选择),然后启动 VM。

(注意:此后,我需要插入第二只鼠标,因为我必须将普通鼠标的控制权交给 Windows VM,以便 SetPoint 软件能够看到它不仅仅是一个普通鼠标。)

4) 在 VM 中,我启动了 SetPoint 软件,然后转到允许您为各种按钮设置自定义操作的屏幕。然后返回 Wireshark,我开始在 USB 总线上捕获鼠标,然后立即进入 VM/SetPoint,并将按钮分配从 DPI +/- 更改为按键分配,然后立即返回 Wireshark 并停止捕获。(我重复了大约 10-15 次,将设置更改为不同的模式,主要是因为我不确定我需要多少数据,但经过检查,我真的只需要前 1-2 次捕获。)

假设您的鼠标工作原理与我的类似,我猜是这样,那么您的捕获可能总共有 16 帧,4x GET DESCRIPTOR,然后 3x(2xURB_CONTROL 输出 + 2xURB_INTERRUPT 输入)。您要查找的是 3 个较长的 URB_CONTROL 输出帧。我捕获的一个帧的示例如下:

0000  c0 80 64 36 00 88 ff ff  53 02 00 03 03 00 00 00
0010  5e 4b 25 50 00 00 00 00  f4 d9 08 00 8d ff ff ff
0020  07 00 00 00 07 00 00 00  21 09 10 02 01 00 07 00
0030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
0040  10 01 80 65 82 85 ff

我们正在寻找的是响应的最后 7 个字节(在上面,即“10 01 80 65 82 85 ff”),来自每个较长的“URB_CONTROL out”帧。最后,我从以下网址下载了“g_hack”的源代码:Git,并在顶部拼凑了我的鼠标产品代码和一个新选项(我将它设置为 0/1,并在其中使用 if 语句,因为这只是一个非常粗略的概念证明),这会将我的鼠标切换到“驱动模式”或“DPI 模式”。

之后,所需要做的就是在您选择的重新映射程序中设置新可用的鼠标按钮(我使用 easygestures 因为这是我找到的第一个具有 UI 的东西 - 它可能有也可能没有更好的替代品)。

相关内容