2022-02-13 (日)
* screen:1:0
Chromeでスクリーンをキャプチャしたときの,ビデオトラックのラベル,screen:1:0
みたいな名前になってるけど,これからディスプレイを識別したい.
普通にWindowsのディスプレイ設定で表示されるモニタの番号の順序だと思って,EnumDisplayMonitorsで列挙してみたけど,Chrome上の順序と何か違う…….プライマリディスプレイが0番というわけでもなさげ.
仕方ないので,Chromiumのソース眺めてみたけどスクリーンキャプチャしそうな実装が見当たらない.Chromeにしかないのかと思ったけどWebRTCの実装の中にあった.
EnumDisplayDevicesで列挙された順序っぽい.
* Windows 10のディスプレイのDPI
最近のWindoesでDPIが異なるディスプレイが混在しているときの,論理座標の挙動がとても難解な気がする.
Windows Vistaあたりから,プログラムから見えるウインドウやマウスの座標はDPIに依存したものになって,プロセスの状態によってWin32APIも違う値を返すようになる.大抵はWindowsが不思議な変換をして良い感じにしてくれるのだけど,複数のディスプレイを同時に扱おうとすると途端に面倒に.
面倒になって,SetProcessDPIAwareでDPI無視するようにしてみたけど,それでも座標が一致しない.EnumDisplaySettingsExで取得したディスプレイ情報と,ディスプレイのマウスの座標を見比べてると,ディスプレイ間の座標が連続してなくて謎の隙間があることになっている…….プロセスに紐付いてるディスプレイのDPIに依存してマウスの座標等も変わるので,辻褄を合わせるために座標をずらしてるっぽい.
Windows10で追加された,SetProcessDpiAwarenessContext()で DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 に設定したら全てのディスプレイの座標がEnumDisplaySettingsExで返ってくるものに一致するようになった気がするけど,本当に信じてよいのか分からないな.