结合进程级文件操作监控和窗口行为识别来覆盖更多场景,以下是更精准的实现思路:
一、核心改进:监控进程的 “所有文件操作”(而非固定路径)
不依赖默认保存路径,直接追踪微信、QQ、钉钉进程正在读写的所有文件,只要进程触发文件传输相关的读写行为(如接收 / 发送文件),就能被捕获。
- 实现工具:使用
psutil
库(跨平台)或pywin32
(Windows 专属)。 - 关键逻辑:
- 先通过进程名找到目标进程(如微信
WeChat.exe
、QQQQ.exe
、钉钉DingTalk.exe
),获取进程 ID(PID)。 - 调用
psutil.Process(PID).open_files()
,实时获取该进程当前打开的所有文件列表。 - 筛选特征:若打开的文件满足 “文件大小持续增长”(传输中)、“文件后缀为常见传输类型(如 docx、pdf、zip 等)”,即可判定为正在进行文件传输。
- 先通过进程名找到目标进程(如微信
例如:当用户手动选择将 QQ 文件保存到 D:\Downloads
时,psutil
能捕获到 QQ.exe
正在读写 D:\Downloads\XXX.pdf
,且文件大小在不断增加,从而识别传输行为。
二、补充方案:识别 “文件传输窗口”(覆盖手动确认场景)
用户手动保存文件时,会先弹出 “另存为” 窗口;接收文件时,会弹出 “接收 / 拒绝” 弹窗,监控这些特定窗口可进一步确认传输意图。
- 实现工具:
pywin32
(Windows)或PyQt5
的窗口监控功能。 - 关键逻辑:
- 遍历系统所有顶层窗口,通过 “窗口标题” 或 “窗口类名” 匹配目标窗口(如 QQ 的 “另存为” 窗口标题含 “另存为”,微信接收窗口类名可通过工具(如 Spy++)提前获取)。
- 一旦检测到这些窗口存在,即可判定用户有 “手动传输文件” 的意图,再结合第一步的进程文件操作,双重确认传输行为。
三、终止传输:精准中断(避免关闭整个程序)
相比直接杀进程,优先针对 “传输行为本身” 中断,减少对用户正常使用的影响:
- 中断文件读写:通过
psutil
找到进程打开的传输文件句柄,调用系统接口(如 Windows 的CloseHandle
)强制关闭该文件句柄,导致传输因 “文件无法写入 / 读取” 而失败(需注意系统权限,部分进程可能防护)。 - 模拟窗口操作:若检测到 “另存为”“接收确认” 窗口,用
pyautogui
或pywin32
模拟点击 “取消” 按钮,直接终止用户的手动传输操作(更友好,不影响程序运行)。
这种方案不依赖固定路径,既能覆盖 “自动接收”,也能监控 “手动保存”,识别精度和灵活性会显著提升。