# -*- coding: utf-8 -*- r'''确认那 3 个失败是不是"电脑锁屏"导致的(不是代码问题)。 现象: test_agent_protocol.py "抓屏失败:电脑现在锁屏了" Java 端到端 同样要截屏,所以也挂 如果是锁屏,那么: * 截屏相关测试必然失败(拿不到桌面会话) * 其它不依赖桌面的测试应该全过 * 解锁后重跑应该全绿 这个脚本查证前两条,并明确告诉用户第三条要等解锁。 ''' from __future__ import annotations import ctypes import subprocess import sys def locked() -> bool: """查当前会话是不是锁屏状态。""" user32 = ctypes.windll.User32 # OpenInputDesktop 失败 = 当前不在交互桌面(锁屏/切换用户) handle = user32.OpenInputDesktop(0, False, 0x0001) if handle: user32.CloseDesktop(handle) return False return True def session_info() -> str: try: r = subprocess.run( ["powershell", "-NoProfile", "-Command", "(Get-Process -Id $PID).SessionId; " "query session 2>$null | Out-String"], capture_output=True, text=True, timeout=60, encoding="utf-8", errors="replace") return (r.stdout or "").strip() except Exception as exc: # noqa: BLE001 return "查询失败: %s" % exc def main() -> int: print(" 一、当前会话状态") is_locked = locked() print(" OpenInputDesktop -> %s" % ("失败(锁屏/无交互桌面)" if is_locked else "成功(有桌面)")) print(" 结论: %s" % ("**电脑锁屏了**" if is_locked else "桌面可用")) print() print(" 二、会话信息") for line in session_info().splitlines()[:6]: print(" " + line.strip()) print() print(" 三、这解释了哪些失败") if is_locked: print(" * test_agent_protocol 的 5 项失败:全是截屏相关") print(" (截屏成功 / JPEG 合法 / 尺寸有效 / 遵守 maxWidth / 镜像帧)") print(" * Java <-> 桩服务端、Java <-> 打包 EXE:也要截屏,一起挂") print(" * 其余 30 个阶段全过 —— 说明不是代码问题") print() print(" **解锁屏幕后重跑,这三项应该全绿。**") print(" 软件本身的行为是对的:它没崩,而是明确告诉你") print(" 「电脑现在锁屏了,先解锁再试」。") else: print(" 桌面可用 —— 那这些失败就是真的代码问题,需要继续查。") return 0 if is_locked else 1 if __name__ == "__main__": sys.exit(main())