2022-03 << 2022-04 >> 2022-05

2022-04-12 (火)

* Windows上のElectronアプリのdesktopCaptureの挙動

desktopCaptureモジュールでキャプチャしたウインドウの座標を取得したりするため挙動を確認したのだけど少し癖がある.

  • プロセスのDPI Awareness
    • DPI_AWARENESS_CONTEXT_PER_MONITOR_AWAREだった.いまのところWindows 10以降で実行した場合も_V2の方ではない.無理やり変更すると間違った領域がキャプチャされたりするので,他の設定はサポートされてなさそう.
  • DPIがシステムの設定と異なるウインドウをキャプチャするとマウスカーソルの位置がおかしい
    • ChromeのScreen Capture APIもダメだったので,そもそもChromiumが真面目にウインドウごとのDPI処理してなさそう.
  • SetForegroundWindowした瞬間に別のウインドウが映り込む
    • 対象のウインドウがフォアグラウンドかどうかでキャプチャ方法を切り替えてるみたいで,フォアグラウンドになる途中で重なったウインドウが表示されるっぽい.
  • ディスプレイのboundsの単位がdip(Device-Independent Pixels)
    • DPI_AWARENESS_CONTEXT_PER_MONITOR_AWAREなので物理座標だと思ってたけど違うっぽい.screen.dipToScreenPoint()で物理座標を取得できるけど,この関数はwin32以外ではundefinedっぽいのでplatformを見て処理を切りかえる必要がある.
  • getSources() がとても重い
    • デフォルトでは全ウインドウのサムネイルやアイコンを取得する.オプションで無効にできる.サムネイル取得するとかはAPI分けてほしかったけど,Chromeのようなスクリーンの選択画面を作ることを想定してるっぽい.
  • ディスプレイの電源切ったりするとgetSourcesしたときdisplay_idが空になる
    • 分からないでもないけど不便.display_idは無いけどキャプチャはできる.とりあえずプライマリディスプレイとして扱えば大丈夫?
2022-03 << 2022-04 >> 2022-05