机器上连接有大于 1 个物理显示器,且分辨率不一致,串流时,无法简单的通过 displayswitch 切换扩展显示或复制显示,因为这样分辨率会被拉低到所有显示器中分辨率最低的那个。
在这种情况下,即使通过虚拟显示器,有时候,游戏也会显示到物理显示器上,导致串流时什么都看不到。
总结就是
为了解决这个问题,我的思路是,在串流时,断开虚拟显示器以外的所有监视器,并将虚拟显示器设置到 moonlight 客户端分辨率。
市面上,目前还没看到有类似的工具,但是好在写起来并不麻烦,只是简单的即使 WIN32 API 。
但是这一步仍然遇到了问题。
由于游戏时需要仅保留虚拟显示器,其他的均要断开,那么在游戏结束时就需要恢复监视器的原本连接状态。
但是我发现通过EnumDisplayDevices(NULL, deviceIndex, &displayDevice, 0)
返回的结构体PDISPLAY_DEVICEA
中StateFlags
字段,无论是否已连接,值都是一样的。
通过询问 Copilot ,告知可以通过EnumDisplaySettingsEx(displayDevice.DeviceName, ENUM_CURRENT_SETTINGS, &devMode, 0)
,判断监视器的分辨率是否为 0 ,得值监视器是否已断开。
但是,实际运行后发现,即使在设置中,将某个监视器 disconnect 后,此 API 依旧会正常返回其原先的分辨率。
那么,这一步就卡死在这里了,因为我无法在开启虚拟监视器前,判断原本的状态,进而导致,无法在游戏后恢复原先的监视器连接状态。
除了我想到的这个方法以外,在多个物理监视器的情况下,串流如何解决串流分辨率与客户端保持一致的问题?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.