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

使用pyautogui/win32api/pydirectinput无法在老游戏窗口内有效点击交互

问题现象

编写自动化脚本时可正常定位目标游戏窗口,但模拟的鼠标点击操作既无法移动游戏角色,也不能和游戏内任何元素产生交互。

已尝试的排查操作

代码侧调整

  • 调整鼠标移动模拟逻辑
  • 补充键盘输入模拟逻辑
  • 切换游戏全屏/窗口化显示模式
  • 用pyautogui做截图识别定位后触发点击
    以上操作全部未生效。

系统侧配置

目标为2000年首发的老旧游戏,已尝试以下系统配置调整:

  • 以管理员身份运行程序
  • 开启Windows XP SP2/SP3兼容模式
  • 禁用桌面合成
    调整后问题仍然存在。

测试代码与运行表现

win32api 实现版本

代码:

import win32api, win32con
import time

def click(x,y):
    win32api.SetCursorPos((x,y))
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)
# click(573, 841)
# time.sleep(1)
# click(289, 342)
# time.sleep(1)
time.sleep(5)
click(319, 399)
x = win32api.GetCursorPos()
print(x)

运行报错:

win32api.SetCursorPos((x,y)) pywintypes.error: (0, 'SetCursorPos', 'No error message is available')

pyautogui + pydirectinput 实现版本

代码:

import pyautogui
import pydirectinput as p

import time

icon = pyautogui.locateCenterOnScreen('./icon.png', confidence=0.9)
p.click(icon[0], icon[1])
time.sleep(2)
p.press('enter')

运行表现:代码无报错可正常执行完成,但游戏窗口内无任何有效点击响应。

根因说明与解决方法

2000年前后的Windows老游戏,多数不会读取系统层派发的鼠标消息,而是直接读取硬件端口的原始输入数据。常规mouse_event、pyautogui/pydirectinput封装的模拟输入都属于上层消息注入,会被这类游戏直接忽略。win32api版本的SetCursorPos报错,通常是坐标不匹配、权限不对或者窗口未激活导致的。
可按以下顺序排查修复:

  1. 先做基础适配:关闭系统显示缩放的高DPI自动适配,避免截图识别的坐标和游戏实际客户区坐标偏移;脚本和游戏保持相同权限运行,要么都开管理员,要么都用普通用户权限,权限差会导致系统拦截输入消息;触发点击前先把游戏窗口切到前台激活,老游戏基本不支持后台输入。
  2. 修复win32api版本报错:调用点击前先通过win32gui.FindWindow获取游戏窗口句柄,用ClientToScreen接口把游戏内相对坐标转成屏幕绝对坐标再传入SetCursorPos,避免坐标越界触发无提示错误。
  3. 替换输入模拟方案:放弃上层消息注入的模拟方式,改用驱动级输入模拟,比如调用SendInput接口时带上硬件输入标识,这类模拟会被系统识别为真实硬件输入,老游戏可以正常响应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:48:24