[高效] Logitech MX Master 3 在Linux与Windows下快速切换

1.0 Logitech MX Master 3 在Linux与Windows下快速切换

趁着打折入手了 Logitech MX Master 3,用起来手感很惊艳,而且”快速滚轮“很好用。

无奈安装了Logitech Options之后发现介绍的快速切换设备的Flow无法工作在Linux下。而且鼠标的智障设计把切换设备的按钮放到了鼠标背面,每次都需要翻过来才能切换设备,而且这个切换设备的操作不能映射到其他表面按钮。一度想退掉换M720,但是又舍不得到手的低价产品和扎实的手感。

最后看到了网上的几个开源库,折腾了一番最终实现了按下中键下方的按钮实现在Ubuntu和Windows之间切换。(p.s. 这个不是无缝切换,会稍稍有些延迟)

2.0 Linux上的鼠标按键自定义

2.1 安装Logiops

logiops是一个开源项目,实现了部分Logitech的鼠标的按键自定义功能。该项目支持自定义MX Master 3。

在Linux系统上安装logiops

安装方法只需要跟着readme,装好依赖,make就好,在Ubuntu下

sudo apt install cmake libevdev-dev libudev-dev libconfig++-dev
git clone https://github.com/PixlOne/logiops.git
cd logiops
mkdir build
cd build
cmake ..
make

# 安装到系统
sudo make install

如果想测试的话就运行

sudo ./logid

配置文件在 /etc/logid.cfg 在中

启动服务

sudo systemctl restart logid
sudo systemctl enable logid

自动重启服务

Add an udev rules in /etc/udev/rules.d/90-my.rules

# /etc/udev/rules.d/90-my.rules
ACTION=="add", SUBSYSTEM=="bluetooth", RUN{program}="/bin/systemctl  restart logid.service"

and call

sudo udevadm control --reload

This will restart logid service when a new bluetooth device added.
If your mouse use the usb, you can modify "bluetooth" to "usb".

配置Logiops

devices: (
{
    name: "Wireless Mouse MX Master 3";
    buttons: (
        {
            cid: 0xc3;
            action =
            {
                type: "Gestures";
                gestures: (
                    {
                        direction: "Up";
                        mode: "OnRelease";
                        action =
                        {
                            type: "Keypress";
                            keys: ["KEY_UP"];
                        };
                    },
                    {
                        direction: "Down";
                        mode: "OnRelease";
                        action =
                        {
                            type: "Keypress";
                            keys: ["KEY_LEFTMETA", "KEY_D"];
                        };
                    },
                    {
                        direction: "Left";
                        mode: "OnRelease";
                        action =
                        {
                            type: "CycleDPI";
                            dpis: [400, 600, 800, 1000, 1200, 1400, 1600];
                        };
                    },
                    {
                        direction: "Right";
                        mode: "OnRelease";
                        action =
                        {
                            type = "ChangeHost";
                            host = 1;
                        }
                    },
                    {
                        direction: "None"
                        mode: "OnRelease";
                        action =
                        {
                            type: "Keypress";
                            keys: ["KEY_LEFTALT", "KEY_TAB"];
                        };
                    }
                );
            };
        },
        {
            cid: 0xc4;
            action =
            {
                type: "ChangeHost";
                host = 1;
            };
        }
    );
}
);

在Windows上实现切换设备

观察了下Logiops的源码,发现调用了hidpp库的功能实现控制鼠标的。因此在Windows就将目光转向了hidpp这个项目,因为在项目的介绍页上说该项目可以在Windows上编译。

在Windows上编译安装hidpp

这个花了我很长时间琢磨,首先我自己电脑上有Visual Studio,所以当然选择用MSVC编译安装了。

在hidpp的简介中,介绍了如果使用MSVC编译,需要getopt库的支持,而项目建议使用vcpkg中的getopt。

getopt的获取

vcpkg介绍了工具的安装方法,十分简单clone下来库并运行一个.bat即可完成安装了。

> git clone https://github.com/microsoft/vcpkg
> .\vcpkg\bootstrap-vcpkg.bat
# 安装getopt库
> .\vcpkg\vcpkg install getopt

这里注意VS需要安装English语言包才能正常使用vcpkg的功能!

在vcpkg 的安装目录下寻找

installed\x86-windows\include # 头文件路径
installed\x86-windows\lib     # 库路径

按照vcpkg的介绍,cmake只需要设定一个变量即可自动查找到由vcpkg安装过的库,但是不知道是不是hidpp项目的CMakeList没有处理vcpkg的内容,所以需要手动指定getopt的路径

cmake安装

cmake是比较常用的构建工具,并且在MSVC 2015之后就支持cmake了,下载msi安装包安装即可。

hidpp的编译

  • 构建

    git clone https://github.com/cvuchener/hidpp.git
    mkdir build
    cd build

    创建构建的VS工程

    cmake .. -DGETOPT_INCLUDE_DIR=/installed/x86-windows/include -DGETOPT_LIBRARY=/installed/x86-windows/lib/getopt.lib -DBUILD_SHARED_LIBS=OFF -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON -A Win32

注意手动指定getopt的路径,按照hidpp介绍中的说明关掉shared libs的开关, -A Win32 来指定编译32位应用(因为getopt是32位的!)

  • 编译

cmake构建完之后,会在目录中生成VS的工程,找到hidpp.sln来打开vs

image

之后执行生成解决方案来编译全部内容。

image

编译好之后,在<Path-to-hidpp>\build\src\tools\Debug中找到编译好的工具。

使用hidpp工具切换MX Master 3的主机

获取鼠标设备路径

首先在powershell中切换目录到<Path-to-hidpp>\build\src\tools\Debug

运行hidpp-list-devices.exe来获取设备地址,其中冒号前面的全部内容就是设备地址了。

image

BTHLEDEVICE\{00001812-0000-1000-8000-00805F9B34FB}_DEV_VID&02046D_PID&B023_REV&0015_D1758C989E14\8&315FBC5A&0&0021

切换鼠标主机的方法

按照Nestor Lopez Casado for providing Logitech documentation on the HID++ protocol中x1814_change_host.pdf中的方法,

image

.\hidpp20-call-function.exe "BTHLEDEVICE\{00001812-0000-1000-8000-00805F9B34FB}_DEV_VID&02046D_PID&B023_REV&0015_D1758C989E14\8&315FBC5A&0&0021" 10 1 0

其中参数10 表示change_host_feature, 1表示调用上图中的setCurrentHost方法,0表示鼠标上的1号设备(没错设备编号是从0开始的)

使用Logitech Options把切换主机命令映射到鼠标按键

image

我选择设置滚轮下面的按钮为切换设备,原因是这个按钮的默认功能是切换滚轮方式,但是smartshift的体验足够好,不需要手动切换,因此就把这个按键换了。

但是经过测试这个启动应用程序并不能附加参数,因此不能把上面一大行放入这里执行。

因此在VS中写了一个简单的应用程序来调用

#include <iostream>

//不显示控制台  
#pragma comment( linker, "/subsystem:windows /entry:mainCRTStartup" )
int main()
{

	system("<path-to-hidpp>\\build\\src\\tools\\Debug\\hidpp20-call-function.exe \"BTHLEDEVICE\\{00001812-0000-1000-8000-00805F9B34FB}_DEV_VID&02046D_PID&B023_REV&0015_D1758C989E14\\8&315FBC5A&0&0021\"  10 1 1");
}

注意更改路径,别忘记转义特殊符号

最终生成的CallPS.exe就是执行了上面hidpp20-call-function.exe的那一大串命令,这样就可以切换了。

posted @ 2022-01-05 15:40  ArtisticZhao  阅读(4823)  评论(5编辑  收藏  举报