Sunshine & Moonlight 串流,在多物理显示器的情况下,如何优雅的切换? WIN32 API EnumDisplayDevices 如何判断监视器是否连接状态?

59 天前
gam2046  gam2046

现状

机器上连接有大于 1 个物理显示器,且分辨率不一致,串流时,无法简单的通过 displayswitch 切换扩展显示或复制显示,因为这样分辨率会被拉低到所有显示器中分辨率最低的那个。

在这种情况下,即使通过虚拟显示器,有时候,游戏也会显示到物理显示器上,导致串流时什么都看不到。

总结就是

我的想法

为了解决这个问题,我的思路是,在串流时,断开虚拟显示器以外的所有监视器,并将虚拟显示器设置到 moonlight 客户端分辨率。

市面上,目前还没看到有类似的工具,但是好在写起来并不麻烦,只是简单的即使 WIN32 API 。

但是这一步仍然遇到了问题。

由于游戏时需要仅保留虚拟显示器,其他的均要断开,那么在游戏结束时就需要恢复监视器的原本连接状态。

但是我发现通过EnumDisplayDevices(NULL, deviceIndex, &displayDevice, 0)返回的结构体PDISPLAY_DEVICEAStateFlags字段,无论是否已连接,值都是一样的。

通过询问 Copilot ,告知可以通过EnumDisplaySettingsEx(displayDevice.DeviceName, ENUM_CURRENT_SETTINGS, &devMode, 0),判断监视器的分辨率是否为 0 ,得值监视器是否已断开。

但是,实际运行后发现,即使在设置中,将某个监视器 disconnect 后,此 API 依旧会正常返回其原先的分辨率。

那么,这一步就卡死在这里了,因为我无法在开启虚拟监视器前,判断原本的状态,进而导致,无法在游戏后恢复原先的监视器连接状态。

最后

除了我想到的这个方法以外,在多个物理监视器的情况下,串流如何解决串流分辨率与客户端保持一致的问题?

648 次点击
所在节点   程序员  程序员
1 条回复
Busby
Busby
46 天前
试试 sunshine 基地版 https://github.com/qiin2333/Sunshine/releases/tag/alpha
最近找到了这个。解决了我 4K+2K 物理显示器在使用虚拟显示器后需要黑屏的需求。另外串流分辨率能够自动跟客户端一致。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1100879

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX