# 虛擬螢幕

虛擬螢幕是指在您的手機上建立一個或多個虛擬的顯示器，相當於一個隔離執行的後臺螢幕，在後臺螢幕上執行的 APP 和自動化腳本不會影響到裝置主螢幕，也就是說，
在使用自動化腳本在後臺螢幕上自動操作微信回覆訊息的同時，您可以正常使用裝置螢幕刷抖音影片。我們的 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-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)
```