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

Kali Linux下使用evdev模拟Unicode字符输入失效的问题排查及修复方案咨询

Kali Linux下使用evdev模拟Unicode字符输入失效的问题排查及修复方案咨询

你好,我来帮你分析代码里的问题,以及如何让它正确输出目标Unicode字符。

问题根源分析

你的思路是对的——模拟系统原生的Ctrl+Shift+U Unicode输入流程,但代码里有几个关键问题导致系统没有识别出这是Unicode输入序列:

  1. 按键事件同步不及时:部分按键操作后没有调用ui.syn(),系统无法及时处理事件,可能还没进入Unicode输入模式就收到了后续字符。
  2. 十六进制按键无独立同步:输入0、9、8、5这些字符时,仅执行了按下/释放操作但未同步,系统无法正确识别每个字符。
  3. 缺少必要的延迟:真实按键操作有时间间隔,你的代码执行速度过快,系统来不及响应输入模式切换。
  4. 虚拟键盘能力不全:原代码未包含十六进制字母(A-F)的按键支持,后续如果需要输入包含字母的Unicode码会失效。

修复后的代码

import evdev
from evdev import UInput, ecodes as e
import time

# 替换为你的实际键盘设备路径,可通过evtest命令查看
dev = evdev.InputDevice('/dev/input/event2')
dev.grab()  # 拦截原键盘的所有事件

# 扩展虚拟键盘的按键能力,包含Unicode输入所需的所有按键
cap = {
    e.EV_KEY: [
        e.KEY_A, e.KEY_LEFTCTRL, e.KEY_LEFTSHIFT, e.KEY_U,
        e.KEY_0, e.KEY_1, e.KEY_2, e.KEY_3, e.KEY_4, e.KEY_5,
        e.KEY_6, e.KEY_7, e.KEY_8, e.KEY_9, e.KEY_A, e.KEY_B,
        e.KEY_C, e.KEY_D, e.KEY_E, e.KEY_F, e.KEY_ENTER
    ]
}
ui = UInput(cap, name='my_virtual_keyboard')

def press_release_key(key_code, delay=0.08):
    """辅助函数:模拟单键按下-释放,并同步事件、添加延迟"""
    ui.write(e.EV_KEY, key_code, 1)
    ui.syn()  # 同步事件,让系统处理按键按下
    time.sleep(delay)
    
    ui.write(e.EV_KEY, key_code, 0)
    ui.syn()  # 同步事件,让系统处理按键释放
    time.sleep(delay)

try:
    for event in dev.read_loop():
        if event.type == e.EV_KEY:
            key_event = evdev.categorize(event)
            if key_event.keystate == evdev.KeyEvent.key_down:
                # 仅当按下A键时触发Unicode输入
                if key_event.scancode == e.KEY_A:
                    # 步骤1:触发Unicode输入模式(Ctrl+Shift+U)
                    ui.write(e.EV_KEY, e.KEY_LEFTCTRL, 1)
                    ui.write(e.EV_KEY, e.KEY_LEFTSHIFT, 1)
                    ui.syn()
                    time.sleep(0.1)  # 给系统时间响应组合键

                    press_release_key(e.KEY_U)

                    # 释放Ctrl和Shift
                    ui.write(e.EV_KEY, e.KEY_LEFTCTRL, 0)
                    ui.write(e.EV_KEY, e.KEY_LEFTSHIFT, 0)
                    ui.syn()
                    time.sleep(0.1)

                    # 步骤2:输入Unicode十六进制码(示例为0985,对应孟加拉语字母অ)
                    target_unicode_hex = "0985"
                    hex_to_key = {
                        '0':e.KEY_0, '1':e.KEY_1, '2':e.KEY_2, '3':e.KEY_3,
                        '4':e.KEY_4, '5':e.KEY_5, '6':e.KEY_6, '7':e.KEY_7,
                        '8':e.KEY_8, '9':e.KEY_9, 'a':e.KEY_A, 'b':e.KEY_B,
                        'c':e.KEY_C, 'd':e.KEY_D, 'e':e.KEY_E, 'f':e.KEY_F
                    }
                    for char in target_unicode_hex.lower():
                        press_release_key(hex_to_key[char])

                    # 步骤3:按下Enter确认输入
                    press_release_key(e.KEY_ENTER)

        # 透传非按键类事件(如同步事件)
        elif event.type != e.EV_SYN:
            ui.write(event.type, event.code, event.value)
            ui.syn()
finally:
    # 确保程序退出时清理资源
    dev.ungrab()
    ui.close()

关键修改说明

  1. 新增按键辅助函数:统一处理单键的按下、同步、释放流程,确保每个按键事件都被系统正确识别,同时加入模拟真实按键的延迟。
  2. 完善Unicode触发流程:调整Ctrl+Shift+U的按键顺序与同步时机,给系统足够时间切换到Unicode输入模式。
  3. 扩展虚拟键盘能力:加入十六进制字母A-F的按键支持,覆盖所有Unicode码的输入需求。
  4. 安全的资源清理:用try...finally块确保脚本退出时,无论是否报错都能释放原键盘设备与虚拟键盘。

额外注意事项

  • 确保当前用户拥有/dev/input/eventX和/dev/uinput的读写权限,可通过sudo运行脚本解决权限问题。
  • 可通过evtest命令列出所有输入设备,找到对应的键盘设备路径替换代码中的/dev/input/event2。
  • 延迟时间可根据系统响应速度微调,0.05-0.1秒的区间适配大多数系统。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 09:29:38