如何判断进程当前是否正被用户主动使用
记事本进程主动输入状态判断方案
psutil仅能获取进程的基础运行属性,无法判断进程和用户的交互状态,需要结合Windows平台的窗口、输入相关原生API实现需求,可行方案如下:
方案1:前台窗口聚焦检测(最常用)
核心逻辑:用户主动输入时,目标程序窗口必然是系统当前的前台聚焦窗口,仅需匹配前台窗口对应的进程是否为notepad即可完成初步判断
- 依赖工具:Python环境下可使用
pywin32库调用Windows API - 实现步骤:
- 调用
win32gui.GetForegroundWindow()获取当前前台窗口的句柄 - 调用
win32process.GetWindowThreadProcessId()获取该窗口关联的进程PID - 用psutil匹配PID对应的进程名称是否为
notepad.exe,匹配成功即可判定记事本处于前台可输入状态
- 调用
方案2:输入事件关联检测(更精准)
如果需要排除“记事本挂在前台但用户未输入”的场景,可结合输入事件监听实现判断:
- 依赖工具:
pynput库监听全局键盘输入事件 - 实现逻辑:每次监听到键盘按下事件时,执行一次方案1的前台进程匹配逻辑,如果匹配成功则判定为用户正在主动使用记事本输入
方案3:输入空闲时间检测
可通过Windows API获取系统最后一次用户输入的时间,结合前台进程匹配结果进一步缩小判断范围:
- 调用
win32api.GetLastInputInfo()获取系统最后输入时间,和当前时间做差值,差值小于你设定的阈值(比如1秒)且前台进程为notepad时,判定为活跃输入状态
简化实现示例代码
import psutil import win32gui import win32process import time def is_notepad_in_active_input(): # 获取当前前台窗口句柄 foreground_hwnd = win32gui.GetForegroundWindow() # 获取窗口对应的进程PID _, process_pid = win32process.GetWindowThreadProcessId(foreground_hwnd) try: target_process = psutil.Process(process_pid) if target_process.name().lower() == "notepad.exe": # 可在此处添加GetLastInputInfo的时间差判断逻辑,进一步提高准确率 return True except psutil.NoSuchProcess: return False return False # 测试:每秒轮询一次状态 if __name__ == "__main__": while True: if is_notepad_in_active_input(): print("记事本处于用户主动输入状态") time.sleep(1)
注意事项
- 上述所有方案仅适用于Windows平台,相关API为Windows系统专属
- 如果需要判断的是UWP版本的记事本,需额外调整窗口匹配逻辑,适配UWP应用的窗口标识规则
内容的提问来源于stack exchange,提问作者Noob
相关产品推荐
相关产品推荐

