[高效] 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的那一大串命令,這樣就可以切換了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM