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

Gitlab CI远程Windows机器模拟按键失效问题求助

解决思路与方案

1. 确保测试运行在活跃交互式会话

自动登录不代表会话处于交互式活跃状态,GitLab CI的进程可能运行在无桌面的后台会话中。可以:

  • 用query session命令查看当前活跃用户会话ID(通常为1)
  • 使用tscon <会话ID> /dest:console将CI进程切换到活跃桌面会话
  • 配置GitLab Runner在用户交互式会话中启动,而非服务模式

2. 替换keyboard库为底层输入模拟工具

keyboard库依赖钩子机制,在后台会话中易失效。换成基于Windows原生SendInput API的工具:

  • 使用pynput库:直接调用系统API,兼容性更强
    from pynput.keyboard import Controller, Key
    keyboard = Controller()
    # 模拟Ctrl+S快捷键示例
    keyboard.press(Key.ctrl)
    keyboard.press('s')
    keyboard.release('s')
    keyboard.release(Key.ctrl)
    
  • 或用pywin32直接调用SendInput,实现完全自定义的输入事件

3. 保证测试进程与GUI应用同会话、同权限

  • 确认启动GUI应用的socket server和测试脚本在同一个用户会话中运行,跨会话无法传递输入事件
  • 以管理员身份运行测试脚本:CI命令前可添加runas /user:管理员账户 "python test_script.py",或配置Runner以管理员权限启动

4. 强制激活目标GUI窗口再模拟按键

后台运行的GUI应用可能无输入焦点,导致按键无法被捕获:

  • 用pywin32定位并激活窗口:
    import win32gui
    import win32con
    import time
    
    def get_app_handle(window_title):
        return win32gui.FindWindow(None, window_title)
    
    hwnd = get_app_handle("你的应用窗口标题")
    if hwnd:
        win32gui.SetForegroundWindow(hwnd)
        time.sleep(0.5)  # 等待窗口激活完成
    

5. 消除远程桌面会话残留限制

断开RDP后,Windows可能锁定会话输入。可以:

  • 在远程机器上禁用RDP的“断开时锁定会话”设置
  • 用autologon工具确保会话始终处于解锁状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:02:33