遠端 IDD 的 IddCx 1.4 更新
下列 IddCx 1.4 版的更新僅適用於遠端間接顯示驅動程式, (識別碼) 。
遠端 IDD 開發人員也應該看到 控制台的 IddCx 1.4 更新,以及其他更新的遠端識別碼 。
宣告遠端會話的遠端 IDD
IDD 會宣告它想要藉由在IDDCX_ADAPTER_CAPS中設定 IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER 位來建立遠端標識元 配接器。 呼叫 IddCxAdapterInitAsync時旗標字段。 OS 會追蹤是否因為遠端桌面堆疊連線到遠端會話而載入 IDD,並在下列兩種情況下失敗 IddCxAdapterInitAsync 呼叫:
- IDD 未針對作業系統遠端桌面堆疊針對遠端工作所建立的裝置設定IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER
- 操作系統遠端桌面堆疊未建立之裝置的 IDD 集IDDCX_ADAPTER_FLAGS_REMOTE_SESSION_DRIVER
遠端 IDD 的安裝建議
UMDF 允許驅動程式在其 INF 檔案中控制 裝置共享選項 ,並使用 UmdfHostProcessSharing 和 DeviceGroupId 等指示詞。 由於某些鎖定爭用問題,強烈建議遠端 ID 將 UmdfHostProcessSharing 指示詞設定為 ProcessSharingDisabled ,並移除任何 DeviceGroupId 指示詞。 此設定會將每個會話的遠端 IDD 設定為在其自己的進程中。
遠端 IDD 現有 IddCx 功能的其他限制
需要遠端識別碼,才能在 IDDCX_ADAPTER_CAPS 中設定 IDDCX_ADAPTER_FLAGS_USE_SMALLEST_MODE。[旗標] 欄位。 這可確保不會使用虛擬模式,因此交換鏈大小一律會符合桌面解析度。 如果未設定此旗標,IddCxAdapterInitAsync 將會失敗。
遠端ID僅支援漸進式目標模式,因此 IDDCX_TARGET_MODE。TargetVideoSignalInfo.targetVideoSignalInfo.scanLineOrdering 必須設定為 DISPLAYCONFIG_SCANLINE_ORDERING_PROGRESSIVE。 如果未設定此值,IddCxMonitorArrival 將會失敗。
設定遠端會話的顯示組態
當遠端 IDD 控制遠端會話中的所有監視器,而遠端會話顯示組態應該鏡像用戶端的監視器時,遠端 IDD 必須能夠指定 OS 在遠端工作階段中設定的顯示設定。 當會話建立為遠端會話或轉換至遠端會話時,必須設定此顯示組態。
遠端 IDD 可以在遠端工作階段期間將顯示組態更新為下列其中一項:
- 變更目前監視器的設定 (,例如變更桌面位置、方向、實體大小或 DPI)
- 藉由呼叫 IddCxMonitorArrival/IddCxMonitorDeparture,在新增/移除監視器之後設定桌面設定。 遠端標識碼使用 IddCxMonitorArrival 和 IddCxMonitorDeparture ,與控制台標識元相同,以通知操作系統有關監視抵達和離開的資訊。
以下是操作系統用來處理監視抵達、離開和桌面設定變更的邏輯。 針對每個遠端會話,OS 會儲存遠端 IDD 所提供的單一目前桌面設定。 此桌面設定會啟動空白,而且會在每次遠端 IDD 成功呼叫 IddCxDisplayConfigUpdate 時更新。
當驅動程式收到新的顯示組態時
If all monitors in the new display configuration are present in the system
If new display configuration is supported by driver (eg resolutions)
Store new display configuration
Set new display configuration (this will disable any active monitors
that are not part of new configuration)
If all monitors in the new display config are not currently present in the system
Store new display configuration
Disable all active paths and wait for the correct set of monitors to arrive
拿掉監視器時
If removed monitor is not in the current display configuration
Remove the monitor and do not change the current desktop configuration
If removed monitor is part of the current display configuration
Remove the monitor
Disable all active paths and wait for the correct set of monitors to arrive
監視器送達時
If added monitor is not part of current display configuration
Do not change the display configuration
If added monitor is part of the current display configuration
If now all the monitors in the current display configurations are present
Set the new display configuration
以下是一些簡單的案例,說明如何使用 IddCxDisplayConfigUpdate 。
案例 1:新的會話會從兩個連線的監視器開始
驅動程式動作 | 目前的顯示拓撲 | 目前已線上的監視器 | 目前作用中的監視器 | 注意 |
---|---|---|---|---|
None | 無 | 無 | 會話開始設定 | |
IddCxMonitorArrival (Mon1) | 無 | Mon1 | 無 | 沒有作用中的顯示組態,因此不會有任何變更 |
IddCxMonitorArrival (Mon2) | 無 | Mon1、Mon2 | 無 | 顯示組態中仍然沒有變更 |
IddCxDisplayConfigUpdate | Mon1、Mon2 | Mon1、Mon2 | Mon1、Mon2 | 當所有監視器都已連線時,請設定設定 |
注意:驅動程式在新增相同結果的監視器之前,可能已經呼叫 IddCxDisplayConfigUpdate 。
案例 2:將第三個監視器新增至案例 1,使其作用中
驅動程式動作 | 目前的顯示拓撲 | 目前已線上的監視器 | 目前作用中的監視器 | 備註 |
---|---|---|---|---|
IddCxMonitorArrival (Mon3) | Mon1、Mon2 | Mon1、Mon2、Mon3 | Mon1、Mon2 | 不變更顯示組態 |
IddCxDisplayConfigUpdate | Mon1、Mon2、Mon3 | Mon1、Mon2、Mon3 | Mon1、Mon2、Mon3 | 新增組態集 |
案例 3:從作用中的組態移除監視器
驅動程式動作 | 目前的顯示拓撲 | 目前已線上的監視器 | 目前作用中的監視器 | 備註 |
---|---|---|---|---|
Mon1、Mon2 | Mon1、Mon2 | Mon1、Mon2 | 啟動組態 | |
IddCxDisplayConfigUpdate () | Mon1 | Mon1、Mon2 | Mon1 | 將組態變更為只先使用 Mon1 |
IddCxMonitorDeparture (Mon2) | Mon1 | Mon1 | Mon1 |
案例 4:當驅動程式只支援單一模式時,變更路徑的模式
驅動程式動作 | 目前的顯示拓撲 | 目前已線上的監視器 | 目前作用中的監視器 | 備註 |
---|---|---|---|---|
Mon1 10x7 、Mon2 19x10 | Mon1、Mon2 | Mon1、Mon2 | 啟動組態 | |
IddCxMonitorUpdateModes (Mon1 支援 16x9) | 無 | Mon1、Mon2 | 無 | 已將 Mon1 的模式清單更新為 16x9 |
IddCxDisplayConfigUpdate () | Mon1 16x9、Mon2 19x10 | Mon1、Mon2 | Mon1、Mon2 | 將 Mon1 的組態設定為 16x9 |
處理IddCxDisplayConfigUpdate錯誤
遠端驅動程序必須處理 來自 IddCxDisplayConfigUpdate 的錯誤。 預期會發生某些錯誤;例如,當連接使用暫存會話時。
在初始設定中未預期的案例中,驅動程式有下列選項:
- 呼叫 IddCxReportCriticalError 以終止驅動程序進程,並中斷用戶會話的連線。 建議驅動程式使用唯一的主要/次要組合,以便在當機和 Watson 報告中識別這些案例。
- 在發生暫時性錯誤時,再次重試組態。
- 嘗試不同的組態。
遠端驅動程式可能會決定中會話組態變更失敗不如初始設定失敗一樣重要,因此可能永遠不會呼叫 IddCxReportCriticalError 中間會話。
如果IddCxDisplayConfigUpdate傳回 STATUS_GRAPHICS_INDIRECT_DISPLAY_DEVICE_STOPPED,驅動程式就不應該呼叫IddCxReportCriticalError,因為OS偵測到目標會話已中斷連線,或該會話的IddCx配接器正在停止,因為這是預期的結果。
在間接顯示遠端會話中顯示 API 變更
在遠端 XDDM 工作階段中,OS 顯示控制面板不會為使用者提供任何控件來變更顯示元件。 這主要是因為遠端會話桌面設定是由連線的客戶端系統所控制,而不是由在會話中執行的應用程式所控制。 例如,在遠端會話中支援 Win+P 投影使用者介面並無意義。
一般而言,遠端標識碼會話:
- 顯示列舉 API 的運作方式,包括 QueryDisplayConfig
- 顯示設定 API 無法運作。 例如,遠端會話中執行的應用程式不需要呼叫 ChangeDisplaySettings/SetDisplayConfig 來變更桌面設定 (,例如變更桌面位置或拓撲) 。
有趣的是,遠端 XDDM 解決方案會使用 ChangeDisplaySetting 來變更模式和桌面位置,因為這是可從用戶端套用變更的唯一方式。 由於遠端標識符解決方案具有 IddCxDisplayConfigUpdate 功能, 因此不再需要 ChangeDisplaySetting 才能在遠端標識符會話中運作。
下表顯示 API 和顯示控制面板, (CPL) XDDM 遠端工作階段和 WDDM 遠端工作階段的功能。
API/CPL | XDDM 遠端會話 | WDDM 遠端會話 |
---|---|---|
顯示 CPL | 不會顯示任何資訊,併發出「無法從遠端會話變更顯示設定」的訊息。 | 與 XDDM 遠端會話相同的行為。 |
Win+P UI 和功能 | UI 未顯示且 API 失敗。 | 與 XDDM 遠端會話相同的行為。 |
舊版顯示列舉 API (,例如 EnumDisplaySettings & EnumDisplayDevices) | API 如預期般運作,並傳回相關信息。 | 與 XDDM 遠端會話相同的行為。 |
舊版 ChangeDisplaySetting | 可運作,並用來反映來自用戶端的桌面變更。 | 傳回應用程式相容性原因的成功,但會忽略呼叫,而且不會變更任何顯示組態。 IDD 將使用 IddCxDisplayConfigUpdate 來變更桌面設定。 |
QueryDisplayConfig | 失敗。 | 如預期般運作。 |
DisplayConfigGetDeviceInfo | 失敗。 | 可運作並報告預期的資訊。 |
SetDisplayConfig 和 DisplayConfigSetDeviceInfo | 失敗。 | 與 XDDM 遠端會話相同的行為。 |
監視標識碼遠程會話中的閑置行為
當通訊協定堆棧呼叫 IWRdsProtocolConnectionCallback::StopScreenUpdates 以停止更新客戶端畫面時,OS 會終結交換鏈,並使該會話的所有路徑變成非作用中,導致呼叫 IDD 的EVT_IDD_CX_ADAPTER_COMMIT_MODES 回呼 ,並在 IDDCX_PATH中設定 IDDCX_PATH_FLAGS_NONE。 所有路徑的旗標。
當通訊協定堆棧呼叫 IWRdsProtocolConnectionCallback::RedrawWindow 以再次啟用更新時,OS 會使用 IDD 的 EVT_IDD_CX_ADAPTER_COMMIT_MODES 回呼來設定新的作用中路徑,並建立新的交換鏈結。
在標識碼遠程會話中中斷連線行為
當使用者中斷與遠端會話的連線時,OS 會終結裝載該會話遠端標識符裝置的 devnode,導致該會話的遠端標識元適配卡為 PnpStopped。 UMDF 會呼叫遠端 IDD 的EVT_WDF_DEVICE_D0_EXIT 回呼。
如果會話再次從遠端連線,OS 將會為該工作階段的遠端 IDD 建立新的開發節點。 遠端 IDD 應該再次經歷一般啟動順序、初始化配接器,然後新增監視等。