现状
机器上连接有大于 1 个物理显示器,且分辨率不一致,串流时,无法简单的通过 displayswitch 切换扩展显示或复制显示,因为这样分辨率会被拉低到所有显示器中分辨率最低的那个。
在这种情况下,即使通过虚拟显示器,有时候,游戏也会显示到物理显示器上,导致串流时什么都看不到。
总结就是
- 直接串流到物理显示器,分辨率无法与 moonlight 客户端匹配,手机、平板等,总是一些 PC 上不常见的分辨率
- 虚拟监视器,可以任意自定义分辨率,但是在不断开其他监视器的情况下,无法确保游戏在虚拟监视器启动
- 显示选项选择为复制的情况下,所有监视器分辨率会被降低到最低的监视器分辨率
我的想法
为了解决这个问题,我的思路是,在串流时,断开虚拟显示器以外的所有监视器,并将虚拟显示器设置到 moonlight 客户端分辨率。
市面上,目前还没看到有类似的工具,但是好在写起来并不麻烦,只是简单的即使 WIN32 API 。
但是这一步仍然遇到了问题。
由于游戏时需要仅保留虚拟显示器,其他的均要断开,那么在游戏结束时就需要恢复监视器的原本连接状态。
但是我发现通过EnumDisplayDevices(NULL, deviceIndex, &displayDevice, 0) 返回的结构体PDISPLAY_DEVICEA 中StateFlags 字段,无论是否已连接,值都是一样的。
通过询问 Copilot ,告知可以通过EnumDisplaySettingsEx(displayDevice.DeviceName, ENUM_CURRENT_SETTINGS, &devMode, 0) ,判断监视器的分辨率是否为 0 ,得值监视器是否已断开。
但是,实际运行后发现,即使在设置中,将某个监视器 disconnect 后,此 API 依旧会正常返回其原先的分辨率。
那么,这一步就卡死在这里了,因为我无法在开启虚拟监视器前,判断原本的状态,进而导致,无法在游戏后恢复原先的监视器连接状态。
最后
除了我想到的这个方法以外,在多个物理监视器的情况下,串流如何解决串流分辨率与客户端保持一致的问题?
|