如何创建仅向单个窗口发送输入的AFK Bot?
实现仅向单个窗口发送输入的AFK Bot
当然可以实现,你的pyautogui脚本失效是因为它是全局模拟输入——必须让目标窗口保持激活状态才能生效,一旦你切换到其他窗口操作,输入就会跑到当前激活的窗口里,而且没法同时正常使用PC。要实现定向窗口输入,得借助Windows API直接给目标窗口发消息,不需要抢占焦点。
核心思路
Windows系统里每个窗口都有唯一的句柄(HWND),我们可以通过窗口标题找到这个句柄,然后用SendMessage函数直接给该窗口发送键盘/鼠标消息,完全不影响其他窗口的正常使用。
所需工具
需要安装pywin32库,它封装了Windows API:
pip install pywin32
示例代码(定向发送WASD移动指令)
下面的代码会持续向指定窗口发送W键按下/松开的消息,同时你可以正常操作其他窗口:
import win32gui import win32api import win32con import time # 替换成你的游戏窗口标题(注意匹配准确,大小写敏感) TARGET_WINDOW_TITLE = "你的游戏窗口标题" # 获取窗口句柄 hwnd = win32gui.FindWindow(None, TARGET_WINDOW_TITLE) if not hwnd: print(f"找不到窗口:{TARGET_WINDOW_TITLE}") exit() # 键盘消息常量 WM_KEYDOWN = 0x0100 WM_KEYUP = 0x0101 VK_W = 0x57 # W键的虚拟键码 def send_key(hwnd, vk_code, press=True): """向指定窗口发送按键按下/松开消息""" msg = WM_KEYDOWN if press else WM_KEYUP win32api.SendMessage(hwnd, msg, vk_code, 0) try: print("AFK Bot已启动,按Ctrl+C停止") while True: # 模拟按住W键1秒,松开0.5秒(循环移动) send_key(hwnd, VK_W, press=True) time.sleep(1) send_key(hwnd, VK_W, press=False) time.sleep(0.5) except KeyboardInterrupt: # 停止时确保松开按键 send_key(hwnd, VK_W, press=False) print("AFK Bot已停止")
针对你原脚本的文本输入改进
如果要实现向指定窗口输入文本(比如你原脚本里的输入"1"并回车),可以用WM_CHAR消息:
import win32gui import win32api import win32con import time TARGET_WINDOW_TITLE = "Rechner" hwnd = win32gui.FindWindow(None, TARGET_WINDOW_TITLE) if not hwnd: print(f"找不到窗口:{TARGET_WINDOW_TITLE}") exit() WM_CHAR = 0x0102 VK_RETURN = 0x0D def send_text(hwnd, text): """向指定窗口发送文本""" for char in text: win32api.SendMessage(hwnd, WM_CHAR, ord(char), 0) time.sleep(0.1) # 发送文本"1"并回车 send_text(hwnd, "1") win32api.SendMessage(hwnd, WM_KEYDOWN, VK_RETURN, 0) win32api.SendMessage(hwnd, WM_KEYUP, VK_RETURN, 0)
注意事项
- 窗口标题必须准确,如果你不知道窗口的精确标题,可以用
win32gui.EnumWindows遍历所有窗口获取标题和句柄。 - 部分游戏用DirectInput处理输入,这种情况下
SendMessage可能无效,需要用更底层的SendInput结合窗口钩子,或者使用专门的游戏输入模拟库。 - 确保你的程序有足够权限,部分游戏可能会拦截非用户手动的输入,可能需要以管理员身份运行脚本。
内容的提问来源于stack exchange,提问作者Knax Tom
相关产品推荐
相关产品推荐

