如何用Python控制MSI App Player鼠标自动点击?点击失效问题求助
解决MSI App Player中PyDirectInput点击无响应的问题
核心原因
MSI App Player基于VirtualBox/BlueStacks内核,其沙箱环境会拦截部分Windows标准输入模拟API,PyDirectInput默认的SendInput调用可能无法穿透到模拟器内部,导致点击动作无效但无报错。
可行解决方案
1. 切换PyDirectInput的输入模式
改用更底层的mouse_eventAPI替代默认的SendInput,在代码开头添加配置:
pyd.FAILSAFE = False pyd.PAUSE = 0 pyd.use_mouse_event() # 切换到兼容性更好的输入模式
2. 强制激活模拟器窗口
点击前确保模拟器处于前台焦点,避免输入被其他窗口拦截:
import pyautogui as pi # 获取模拟器窗口(标题需匹配你的MSI App Player窗口名称) simulator_window = pi.getWindowsWithTitle("MSI App Player")[0] simulator_window.activate() time.sleep(0.2) # 给窗口焦点切换预留时间
将这段逻辑加到每个点击函数的开头。
3. 修正坐标偏移问题
模拟器窗口可能存在边框或缩放,需将相对坐标转换为屏幕绝对坐标:
def get_absolute_coords(window, rel_x, rel_y): # rel_x/rel_y为窗口内相对坐标(0-1范围) left, top, width, height = window.left, window.top, window.width, window.height return left + int(width * rel_x), top + int(height * rel_y)
调用时先转换坐标再执行点击:
abs_x, abs_y = get_absolute_coords(simulator_window, 0.6, 0.8) pyd.moveTo(abs_x, abs_y)
4. 尝试组合按键触发点击
部分模拟器对单一点击无响应,可尝试绑定辅助按键:
pyd.keyDown('ctrl') pyd.click() pyd.keyUp('ctrl')
也可替换为shift等其他按键测试。
5. 切换到pyautogui原生点击
若PyDirectInput仍无效,改用pyautogui的点击函数并配置参数:
pi.click(x, y, clicks=1, interval=0.04, button='left')
同时关闭pyautogui的安全防护:
pi.FAILSAFE = False
调整后的完整代码示例
import pyautogui as pi import time import pydirectinput as pyd # 初始化配置 pyd.FAILSAFE = False pyd.PAUSE = 0 pyd.use_mouse_event() pi.FAILSAFE = False def get_absolute_coords(window, rel_x, rel_y): left, top, width, height = window.left, window.top, window.width, window.height return left + int(width * rel_x), top + int(height * rel_y) def click_shit(window, rel_x, rel_y): window.activate() time.sleep(0.2) abs_x, abs_y = get_absolute_coords(window, rel_x, rel_y) pyd.moveTo(abs_x, abs_y) for _ in range(200): pyd.click() time.sleep(0.04) def click_reload(window, rel_x1, rel_y1, rel_x2, rel_y2): window.activate() time.sleep(0.2) abs_x1, abs_y1 = get_absolute_coords(window, rel_x1, rel_y1) pyd.moveTo(abs_x1, abs_y1) pyd.click() time.sleep(0.5) abs_x2, abs_y2 = get_absolute_coords(window, rel_x2, rel_y2) pyd.moveTo(abs_x2, abs_y2) pyd.click() if __name__ == "__main__": # 替换为你的模拟器窗口标题 simulator_window = pi.getWindowsWithTitle("MSI App Player")[0] # 替换为窗口内的相对坐标(0-1范围) click_x, click_y = 0.6, 0.8 reload_x1, reload_y1 = 0.1, 0.9 reload_x2, reload_y2 = 0.2, 0.9 while True: click_shit(simulator_window, click_x, click_y) time.sleep(3) click_reload(simulator_window, reload_x1, reload_y1, reload_x2, reload_y2) time.sleep(1)
内容的提问来源于stack exchange,提问作者jie code
相关产品推荐
相关产品推荐

