如何让Python编写的Minecraft AFK挂机脚本仅在目标程序生效
解决方案
要让你的AFK脚本仅针对Minecraft窗口运行、不干扰其他程序,核心是避免全局模拟输入,转而仅在Minecraft窗口激活时执行操作,或直接向Minecraft窗口发送输入事件。以下是两种可行实现方式:
方法一:仅当Minecraft窗口激活时执行点击
这种方式会在你切换到其他窗口(比如YouTube)时自动暂停脚本,回到Minecraft窗口后恢复运行。
步骤1:安装依赖
需要额外安装窗口管理相关库:
pip install pygetwindow pyautogui keyboard pywin32
步骤2:修改代码
import pyautogui as ptg import keyboard as key import pygetwindow as gw import time isclicking = False # 替换为你的Minecraft窗口标题,可通过任务管理器查看具体标题 MINECRAFT_WINDOW_TITLE = "Minecraft" def check_clicking(): global isclicking isclicking = not isclicking key.add_hotkey('F10', check_clicking) while True: if isclicking: try: # 获取Minecraft窗口对象 mc_window = gw.getWindowsWithTitle(MINECRAFT_WINDOW_TITLE)[0] # 仅当窗口激活时执行点击 if mc_window.isActive: ptg.doubleClick() # 控制点击频率,降低CPU占用 time.sleep(0.1) else: time.sleep(0.5) except IndexError: # 未找到Minecraft窗口时暂停循环 time.sleep(1) else: time.sleep(0.5)
方法二:直接向Minecraft窗口发送点击事件(支持最小化窗口)
如果希望Minecraft窗口最小化后脚本仍能运行,需要直接向窗口发送系统级鼠标事件,不过这依赖Minecraft本身支持后台接收输入(部分版本需在游戏设置中开启后台运行)。
修改后的代码
import keyboard as key import win32gui import win32api import win32con import time isclicking = False MINECRAFT_WINDOW_TITLE = "Minecraft" def check_clicking(): global isclicking isclicking = not isclicking key.add_hotkey('F10', check_clicking) def get_minecraft_window_handle(): # 查找Minecraft窗口的系统句柄 return win32gui.FindWindow(None, MINECRAFT_WINDOW_TITLE) def send_double_click_to_window(hwnd): # 向指定窗口发送双击事件 win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0) time.sleep(0.05) win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, 0) time.sleep(0.05) win32api.SendMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, 0) time.sleep(0.05) win32api.SendMessage(hwnd, win32con.WM_LBUTTONUP, 0, 0) while True: if isclicking: hwnd = get_minecraft_window_handle() if hwnd != 0: send_double_click_to_window(hwnd) time.sleep(0.1) else: time.sleep(1) else: time.sleep(0.5)
注意事项
- 窗口标题适配:请根据你的Minecraft实际窗口标题修改
MINECRAFT_WINDOW_TITLE,比如带有版本号的"Minecraft 1.20.1"。 - 后台运行兼容性:部分Minecraft版本在窗口最小化后会暂停游戏进程,此时脚本即使发送事件也无法生效,需在游戏设置中确认是否允许后台运行。
- CPU占用优化:必须添加
time.sleep()控制循环频率,避免脚本持续占用过高CPU资源。
内容的提问来源于stack exchange,提问作者Hundleazz
相关产品推荐
相关产品推荐

