物理输入监控 (PIM)
PIM(Physical Input Monitor)提供人机协同保护机制——当检测到用户正在进行物理键盘/鼠标操作时,自动暂停自动化操作,避免冲突。
基本用法
python
from pywxauto import Weixin
# idle_wait=3: 等待用户停止物理输入 3 秒后再执行操作
wx = Weixin(idle_wait=3)
wx.send_text("张三", "hello") # 自动等待物理空闲工作原理
- 通过 Windows 低级钩子(
SetWindowsHookExW)监控物理键盘和鼠标事件 - 排除程序自身注入的虚拟输入(通过
LLKHF_INJECTED/LLMHF_INJECTED标志判断) - 所有带
@PIM.guard装饰器的方法在执行前,会等待物理输入空闲达到指定秒数
上下文管理器
python
from pywxauto import PIM, Weixin
with PIM(idle_wait=3):
wx = Weixin()
wx.send_text("张三", "hello")手动管理
python
from pywxauto import PIM
pim = PIM(idle_wait=3)
pim.start()
# ... 执行操作 ...
pim.stop()锁定物理输入
在操作期间锁定用户的键盘鼠标(需要管理员权限):
python
wx = Weixin(idle_wait=3, lock_input=True)
# 每次操作时会先锁定输入,操作完成后解锁手动等待空闲
python
from pywxauto import PIM
PIM.start()
# 等待物理空闲 5 秒
PIM.wait_for_idle(5.0)
# 获取当前空闲时长
idle = PIM.get_idle_duration()
print(f"已空闲 {idle:.1f} 秒")@PIM.guard 装饰器
所有 pywxauto 的 UI 操作方法都带有 @PIM.guard 装饰器。你也可以在自己的代码中使用:
python
from pywxauto import PIM
@PIM.guard
def my_operation():
# 执行前自动等待物理空闲
...
@PIM.guard(5) # 固定等待 5 秒空闲
def my_critical_operation():
...注意事项
- PIM 仅在
idle_wait > 0时自动启动 - PIM 是全局单例,所有状态存储在类变量上
lock_input需要管理员权限,否则BlockInput调用会静默失败- 监控线程以 daemon 模式运行,主进程退出时自动结束