Skip to content

物理输入监控 (PIM)

PIM(Physical Input Monitor)提供人机协同保护机制——当检测到用户正在进行物理键盘/鼠标操作时,自动暂停自动化操作,避免冲突。

基本用法

python
from pywxauto import Weixin

# idle_wait=3: 等待用户停止物理输入 3 秒后再执行操作
wx = Weixin(idle_wait=3)
wx.send_text("张三", "hello")  # 自动等待物理空闲

工作原理

  1. 通过 Windows 低级钩子(SetWindowsHookExW)监控物理键盘和鼠标事件
  2. 排除程序自身注入的虚拟输入(通过 LLKHF_INJECTED / LLMHF_INJECTED 标志判断)
  3. 所有带 @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 模式运行,主进程退出时自动结束