Blinue / Magpie

An all-purpose window upscaler for Windows 10/11.
GNU General Public License v3.0
9.66k stars 496 forks source link

优化窗口边框的裁剪 #864

Closed Blinue closed 8 months ago

Blinue commented 8 months ago
  1. 优化了对最大化窗口的支持
    • 修复 Win11 中最大化窗口的不正确裁剪,这是因为 Win11 中 DwmGetWindowAttribute 返回值发生了变化,且 Graphics Capture 捕获区域也和 Win10 不同。由于缺少文档,我测试了很多类型的窗口来做适配,因此现在的实现高度依赖 OS 的实现细节,可能会在未来失效。
    • 修复 Desktop Duplication 无法捕获最大化的窗口的问题。
    • 修复最大化窗口被认为跨越了多个屏幕的问题。
  2. 自动裁剪上边框。这里要考虑太多因素,因为 Win32 窗口实现可谓花样百出。
    1. 如果窗口已最大化,则认为它没有上边框。
    2. 如果窗口禁用了非客户区绘制,则认为它没有上边框。这可以使用 DwmGetWindowAttribute 查询。
    3. 如果窗口使用系统原生边框,则认为它有上边框(仅限捕获标题栏时)。
    4. 如果窗口将客户区扩展到整个窗口,则 DWM 也不会绘制边框。这类窗口的例子包括 https://github.com/melak47/BorderlessWindow 、steam、很多国产应用,基本上没有系统原生边框的窗口都使用这个技术。
    5. 如果窗口自定义了标题栏,而保留了左右下三个方向的原生边框,则认为它上边框。在 Win11 中,DWM 会绘制原生上边框;在 Win10 中,这类窗口很可能会自行绘制上边框(如 Chrome、UWP 等)或者使用 DwmExtendFrameIntoClientArea 保留系统原生上边框(如 Magpie 主窗口、Windows Terminal 等)。
  3. 启用捕获标题栏时也裁剪窗口边框,包括上边框。