# 仮想ディスプレイ

仮想ディスプレイとは、スマートフォン上にひとつまたは複数の仮想ディスプレイを作成することであり、隔離されたバックグラウンド画面として動作します。バックグラウンド画面で動作するアプリや自動化スクリプトはデバイスのメイン画面に影響を与えないため、  
自動化スクリプトがバックグラウンド画面でWeChatの返信を自動操作している間も、メイン画面では通常通り抖音動画を視聴するといった使い方が可能です。当社のWebUIはマルチディスプレイ表示にも対応しており、リモートデスクトップから他の画面を選択して表示・操作することができます。

## 仮想ディスプレイの作成

使い方は簡単です。以下の呼び出しで仮想ディスプレイを作成できます。現在の画面と同じ解像度とDPIを持つ仮想ディスプレイが生成されます。

```python
vd = d.create_virtual_display()
```

もちろん、仮想ディスプレイの解像度とDPIを明示的に指定することもできます。

```python
vd = d.create_virtual_display(width=1080, height=1920, densityDpi=480)
```

## 仮想ディスプレイ上でのアプリ起動

デフォルトでは、新しく作成された仮想ディスプレイには何もアプリが起動していないため、真っ黒な画面に見えます。そのため、まず仮想ディスプレイ内でアプリを起動する必要があります。以下の方法で起動できます。

```python
app = vd.application("com.android.settings")
app.start()
```

```{tip}
この使い方は標準の `d.xxx` とよく似ており、既存のコードの `d.xx` を `vd.xx` に置き換えるだけで、ほとんど変更なしにスクリプトを仮想ディスプレイ向けに切り替えることができます。
```

## 仮想ディスプレイ内での自動化

他の自動化インターフェースに関する章（[基本的な自動化](./ui-basics.md)、[UI操作の応用](./ui-advanced.md)など）を直接参照してください。使い方はそれらと完全に同じです。既存のコードをわずかに変更するだけで、仮想ディスプレイ向けの自動化機能をスクリプトに移行できます。以下のコード例のように、元の `d` を `create_virtual_display` で作成したインスタンスに置き換えるだけです。

```{attention}
仮想ディスプレイから生成された `vd` インスタンスには自動化および関連する操作のみが含まれており、プロキシ設定など全体に影響を与えるメソッドは、引き続き元の `d` インスタンス経由でアクセスする必要があります。自動化カテゴリーに属するインターフェースであっても、グローバルな効果を持つものについては WARNING 情報が出力されます。
```

```python
# 元の d インスタンスを仮想ディスプレイインスタンスに置き換える
_d = Device("example.local")
d = _d.create_virtual_display()

# 元のロジックコード
app = d.application("com.android.settings")
app.start()
...
d(textContains="WLAN").click()
...

# ここで定義する Watcher は仮想ディスプレイにのみ作用します
d.set_watcher_loop_enabled(True)
d.register_none_op_watcher("RecordElementAppearTimes", [Selector(textContains="WLAN")])
d.set_watcher_enabled("RecordElementAppearTimes", True)
# ...
d.screenshot(100).save("screenshot.jpeg")
# ...

# 仮想ディスプレイを解放
d.release_virtual_display()
```

`with` コンテキストを使うこともできます。これにより、ブロック終了後に関連リソースが自動的に破棄されます。

```python
with d.create_virtual_display() as vd:
    do_someting(vd)
```