Skip to content

v1.1.2 · 多屏窗口互换

Choose a tag to compare

@DC1024 DC1024 released this 07 Oct 16:39
· 4 commits to main since this release

修复「已经以管理员身份运行,界面却一直显示普通用户」的问题。

修掉的问题

  • 权限标签永远显示「普通用户」:即使通过「以管理员身份重启」成功提权
    (UAC 已批、进程确实是管理员),界面右上角仍显示
    「权限:普通用户(管理员窗口搬不动)」。

    根因不在权限本身,而在检测函数的一个 ctypes 签名疏漏:GetCurrentProcess()
    返回的 -1 伪句柄经 HANDLE(c_void_p)转成 Python 里的 2⁶⁴−1,
    而 OpenProcessToken 没有显式设置参数签名,ctypes 按默认的 c_int 传参时
    直接 OverflowError——这个异常又被兜底的 except 吞掉,于是
    is_elevated() 在任何进程里都返回 False,包括提权后的自己。

  • 连带修掉的后果:提权后的实例再点「以管理员身份重启」不会正确拦截,
    会再弹一次 UAC;搬不动管理员窗口时的「是否提权」询问也会照常出现。

    修复:给 OpenProcessToken / GetTokenInformation / GetCurrentProcess
    显式设置 argtypes/restype。并用回归测试锁住这个签名(伪句柄必须能原样
    传进 OpenProcessToken)。

升级说明

从 v1.0 / v1.1.x 升级不会丢设置:配置仍在 %APPDATA%\SwapMonitors\config.json。

环境要求

  • Windows 10 / 11(64 位)

已知限制

  • 仅支持 Windows:实现全部基于 Win32 API。
  • 以管理员身份运行的程序需要提权后才能搬运(Windows 的 UIPI 限制,无法绕过)。
  • 躺在其它虚拟桌面上的窗口会被自动跳过(按 DWM cloaked 状态判定)。
  • 部分 UWP 应用由 ApplicationFrameHost 托管,位置由系统管理,可能搬不动。
  • 屏幕分辨率不同(需要缩放)时会有 1px 级别的误差,数学上无法避免;
    同分辨率的屏之间是纯整数平移,逐像素精确。
  • 混合 DPI(两块屏缩放百分比不同)没有在真机上验证过,欢迎反馈实测结果。

校验值

下载后可以核对一下哈希,确认文件完整、未被篡改:

SHA256  SwapMonitors.exe
5a30201811f44135d79eb68c0aabb74c472246c4fb3f33eb5d5df396eff9b0b5

命令行里核对:

certutil -hashfile SwapMonitors.exe SHA256

这个哈希是本地打包产物算出来的,与上传到 Release 的是同一个文件。