Skip to content

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():
    ...

工作原理

  1. 通过 Windows 低级钩子 (SetWindowsHookExW) 监控物理键盘/鼠标事件
  2. 排除程序自身注入的虚拟输入(通过 LLKHF_INJECTED / LLMHF_INJECTED 标志)
  3. 所有带 @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")