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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:56:01