如何通过PID指定进程,让Python脚本仅对目标进程执行输入操作?
针对特定进程执行键盘输入的修改方案
要让键盘输入仅作用于目标游戏进程,核心是避免全局模拟输入,转而定向操作目标进程的窗口。下面提供两种适合新手的实现方案:
方案1:激活目标窗口后发送输入(简单易上手)
先将游戏窗口切换为前台(获得焦点),再执行键盘操作,完成后切回原窗口,不影响你浏览其他内容。
需要安装的依赖
pip install psutil pywin32 pyautogui
修改后的代码示例
import psutil import win32gui import win32process import win32con import pyautogui import time def get_window_handle_by_pid(pid): # 根据PID查找对应进程的主窗口句柄 def window_callback(handle, extra_data): _, window_pid = win32process.GetWindowThreadProcessId(handle) if window_pid == extra_data["target_pid"]: extra_data["handles"].append(handle) return True result = {"target_pid": pid, "handles": []} win32gui.EnumWindows(window_callback, result) return result["handles"][0] if result["handles"] else None # 1. 替换为你的游戏进程名(比如"GTA5.exe") target_process_name = "Game.exe" target_pid = None # 遍历进程查找目标PID for proc in psutil.process_iter(["pid", "name"]): if proc.info["name"] == target_process_name: target_pid = proc.info["pid"] break if not target_pid: print("未找到目标游戏进程") exit() # 2. 获取目标进程的窗口句柄 game_window_handle = get_window_handle_by_pid(target_pid) if not game_window_handle: print("未找到游戏进程对应的窗口") exit() # 3. 保存当前前台窗口,操作完成后切回 current_foreground_window = win32gui.GetForegroundWindow() try: # 激活游戏窗口 win32gui.SetForegroundWindow(game_window_handle) time.sleep(0.5) # 等待窗口完全激活 # 执行键盘操作:这里以按下Ctrl+A为例,可根据需求修改 pyautogui.hotkey("ctrl", "a") # 单独按下/释放Ctrl的写法:pyautogui.keyDown('ctrl'); pyautogui.keyUp('ctrl') finally: # 切回原窗口 win32gui.SetForegroundWindow(current_foreground_window)
方案2:直接向进程窗口发送消息(无需切换窗口)
无需激活游戏窗口,直接通过Windows API向目标进程的窗口发送键盘消息,适合不想干扰当前操作的场景。
代码示例
import psutil import win32gui import win32process import win32api import win32con def get_window_handle_by_pid(pid): def window_callback(handle, extra_data): _, window_pid = win32process.GetWindowThreadProcessId(handle) if window_pid == extra_data["target_pid"]: extra_data["handles"].append(handle) return True result = {"target_pid": pid, "handles": []} win32gui.EnumWindows(window_callback, result) return result["handles"][0] if result["handles"] else None # 查找目标进程PID target_process_name = "Game.exe" target_pid = None for proc in psutil.process_iter(["pid", "name"]): if proc.info["name"] == target_process_name: target_pid = proc.info["pid"] break if not target_pid: print("未找到目标游戏进程") exit() game_window_handle = get_window_handle_by_pid(target_pid) if not game_window_handle: print("未找到游戏进程对应的窗口") exit() # 发送Ctrl按键消息(按下再释放) win32api.SendMessage(game_window_handle, win32con.WM_KEYDOWN, win32con.VK_CONTROL, 0) win32api.SendMessage(game_window_handle, win32con.WM_KEYUP, win32con.VK_CONTROL, 0) # 发送Ctrl+A组合键的写法: # win32api.SendMessage(game_window_handle, win32con.WM_KEYDOWN, win32con.VK_CONTROL, 0) # win32api.SendMessage(game_window_handle, win32con.WM_KEYDOWN, ord('A'), 0) # win32api.SendMessage(game_window_handle, win32con.WM_KEYUP, ord('A'), 0) # win32api.SendMessage(game_window_handle, win32con.WM_KEYUP, win32con.VK_CONTROL, 0)
注意事项
- 部分使用DirectInput的游戏可能不响应
SendMessage,此时方案1更可靠 - 如果操作失败,尝试以管理员身份运行Python脚本
内容的提问来源于stack exchange,提问作者Strewn5490
相关产品推荐
相关产品推荐

