You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下KDE环境屏幕颜色匹配BASH脚本优化求助

优化后的KDE环境鼠标触发脚本

核心优化点

  • 单次屏幕捕获:避免重复调用屏幕抓取工具,一次性提取所有目标像素颜色,大幅减少进程创建开销
  • 启停状态控制:实现鼠标4键单击切换脚本启停,同时触发Alt+5
  • 焦点检测:仅当目标窗口获得焦点时才执行逻辑,避免无效运算
  • 降低CPU占用:空闲时添加短延迟,减少循环频率

优化后脚本代码

#!/bin/bash

# 配置项
MOUSE_ID=12  # 鼠标ID,通过xinput --list获取
TARGET_WINDOW_CLASS="your-target-window-class"  # 目标窗口类名,用xprop WM_CLASS获取
# 目标像素坐标(x,y)
PIXEL_POS=(
    "195,247"
    "1407,681"
    "1200,256"
    "1095,257"
    "1195,258"
)
RUNNING=true  # 脚本启停状态标记

# 监听鼠标4键点击的函数
check_mouse_button4() {
    local state=$(xinput --query-state "$MOUSE_ID")
    if echo "$state" | grep -q "button[4]=down"; then
        # 等待按键释放,避免重复触发
        while echo "$(xinput --query-state "$MOUSE_ID")" | grep -q "button[4]=down"; do
            sleep 0.05
        done
        RUNNING=!$RUNNING
        xdotool key --clearmodifiers alt+5
    fi
}

# 获取目标窗口焦点状态
check_window_focus() {
    local focused_win=$(xdotool getwindowfocus)
    local target_win_class=$(xprop -id "$focused_win" WM_CLASS | awk -F '"' '{print $4}')
    [[ "$target_win_class" == "$TARGET_WINDOW_CLASS" ]]
}

while true; do
    # 先检查鼠标4键切换状态
    check_mouse_button4

    # 脚本未运行或目标窗口未聚焦时,延迟后继续循环
    if ! $RUNNING || ! check_window_focus; then
        sleep 0.05
        continue
    fi

    # 单次抓取屏幕,提取所有目标像素颜色
    local colors=()
    # 用import直接抓取屏幕,一次性处理多个像素
    convert import:- -depth 8 txt:- | while read -r line; do
        for pos in "${PIXEL_POS[@]}"; do
            x=${pos%,*}
            y=${pos#*,}
            if echo "$line" | grep -q "^$x,$y:"; then
                local color=$(echo "$line" | grep -om1 '#\w\+')
                colors+=("$color")
                break
            fi
        done
    done

    # 检查鼠标左键状态
    local mouse_state=$(xinput --query-state "$MOUSE_ID")
    if echo "$mouse_state" | grep -q "button[1]=down"; then
        # 先按下Alt+4
        xdotool key --clearmodifiers alt+4

        # 依次检查像素颜色,触发对应按键
        if [[ "${colors[0]}" == "#FFFFFF" ]]; then
            xdotool key --clearmodifiers alt+1
        fi
        if [[ "${colors[1]}" == "#FFFFFF" ]]; then
            xdotool key --clearmodifiers alt+2
        fi
        if [[ "${colors[2]}" == "#FFFFFF" ]]; then
            xdotool key --clearmodifiers alt+3
        fi
        # 原脚本中的color4/5可根据需求保留或调整
        # if [[ "${colors[3]}" == "#FFFFFF" ]]; then
        #     xdotool key --clearmodifiers alt+X
        # fi
        # if [[ "${colors[4]}" == "#FFFFFF" ]]; then
        #     xdotool key --clearmodifiers alt+Y
        # fi
    fi

    # 短延迟降低CPU占用
    sleep 0.03
done

配置说明

  1. 鼠标ID:通过xinput --list查看你的鼠标设备ID,替换MOUSE_ID
  2. 目标窗口类名:运行xprop WM_CLASS后点击目标窗口,获取窗口类名(第二个引号内的内容),替换TARGET_WINDOW_CLASS
  3. 像素坐标:保留你原脚本中的目标像素位置,已整理到数组中

额外优化建议

  • 如果需要更精准的鼠标事件监听,可替换xinput为libinput工具,减少状态查询开销
  • 若屏幕分辨率固定,可提前计算像素位置的偏移,避免每次循环解析坐标
  • 对于高频触发的逻辑,可考虑用C语言编写核心部分再通过bash调用,进一步提升性能

内容的提问来源于stack exchange,提问作者proxyx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:35:20