PIM
物理输入监控器(Physical Input Monitor),提供人机协同保护机制。
类变量
PIM 是全局单例,所有状态存储在类变量上。
构造方法
python
PIM(idle_wait=0, lock_input=False)- idle_wait
float— 等待物理空闲的秒数 - lock_input
bool— 操作时是否锁定物理输入(需管理员权限)
上下文管理器
python
with PIM(idle_wait=3):
# 在此范围内的操作会等待物理空闲
wx = Weixin()
wx.send_text("张三", "hello")类方法
start()
启动物理输入监控。
stop()
停止监控。
get_idle_duration()
获取当前物理空闲时长。
- 返回
float— 空闲秒数
wait_for_idle(min_idle=3.0, check_interval=0.5)
等待物理输入空闲达到指定秒数。
- min_idle
float— 需要的最小空闲时长 - check_interval
float— 检查间隔
block_input()
锁定物理键盘鼠标输入(需管理员权限)。
unblock_input()
解除锁定。
装饰器
@PIM.guard
为函数添加物理空闲等待保护:
python
@PIM.guard
def my_operation():
# 执行前自动等待物理空闲
...
@PIM.guard(5) # 固定等待 5 秒空闲
def my_critical_operation():
...工作原理
- 通过 Windows 低级钩子 (
SetWindowsHookExW) 监控物理键盘/鼠标事件 - 排除程序自身注入的虚拟输入(通过
LLKHF_INJECTED/LLMHF_INJECTED标志) - 所有带
@PIM.guard的方法执行前会等待物理输入空闲
注意事项
- PIM 仅在
idle_wait > 0时自动启动 lock_input需要管理员权限,否则BlockInput会静默失败- 监控线程以 daemon 模式运行,主进程退出时自动结束
示例
python
from pywxauto import Weixin, PIM
# 方式一:通过 Weixin 参数启用
wx = Weixin(idle_wait=3, lock_input=False)
wx.send_text("张三", "hello") # 自动等待物理空闲
# 方式二:手动管理
PIM.start()
PIM.wait_for_idle(5.0)
idle = PIM.get_idle_duration()
print(f"已空闲 {idle:.1f} 秒")
PIM.stop()
# 方式三:上下文管理器
with PIM(idle_wait=3):
wx = Weixin()
wx.send_text("张三", "hello")