跳轉至

啟用鎖定畫面輸入回呼

當主機 PC 切換至 Windows 鎖定畫面時,OS 安全策略會封鎖 OS 層級的鍵盤和滑鼠輸入。在遠端環境中,畫面和音訊串流仍可傳輸,但無法進行實際的遊戲操作。

過去,遠端使用者需要輸入 Windows 帳戶密碼來解除鎖定。然而,這種方式存在暴露 PC 完整控制權限的風險,且連線流程也較為繁瑣。

Remote Play Plugin 在 Hive Console 的 Remote Play 設定中提供了**不解除鎖定畫面即可遊玩**功能。啟用此功能後,鍵盤、滑鼠、觸控、搖桿、滾輪、縮放等所有輸入事件將直接傳遞至遊戲回呼

主要行為

  • 基於回呼的分發:所有輸入事件將以 eventType: "Control" 的形式傳遞至透過 RegisterCallback 註冊的回呼函式。無論鎖定狀態如何均按相同方式運作,解除鎖定後回呼分發仍會持續。
  • 繞過 OS 輸入路徑:不使用 OS 的 SendInput 路徑,無論 Windows 鎖定狀態如何,都能接收一致的輸入事件。
  • 直接注入遊戲:遊戲將回呼接收到的輸入資料直接注入內部輸入系統,在鎖定狀態和正常狀態下均處理相同的操作。

事前準備

在套用此功能之前,請準備以下內容:

Warning

若在未透過 RegisterCallback 註冊回呼的情況下啟用 Hive Console 的**不解除鎖定畫面即可遊玩**功能,所有輸入事件將遺失,遠端操作將無法正常進行。請務必先註冊回呼。

Control 事件協議

啟用**不解除鎖定畫面即可遊玩**功能後,回呼傳遞的輸入事件與聊天事件採用相同的 JSON 格式,eventType 的值固定為 "Control"。實際輸入類型透過內部的 controlType 加以區分。

Envelope 共通結構

{
    "version"   : "1.02.00",
    "eventType" : "Control",
    "eventValue": {
        "value": {
            "controlType" : "<Key | Click | Wheel | Zoom>",
            "controlValue": {
                "value"  : "<controlType-specific-value>",
                "action" : "<controlType-specific-action>"
            }
        }
    },
    "etc"       : { }
}
欄位 說明
version 固定為 "1.02.00"
eventType 始終為 "Control"
eventValue.value.controlType 輸入類型,共 4 種:"Key" / "Click" / "Wheel" / "Zoom"
eventValue.value.controlValue.value controlType 的資料(座標、鍵碼等)
eventValue.value.controlValue.action controlType 的狀態或動作
etc 空物件

controlType = "Key" - 鍵盤輸入

傳遞鍵盤單一按鍵的按下或放開狀態。Web 用戶端產生的鍵盤輸入和搖桿輸入均會轉換為 controlType

欄位
controlValue.value Windows 虛擬鍵碼的 16 進位字串(例:"0x41" = 'A',"0x57" = 'W',"0x20" = Space)
controlValue.action "Down""Up"

搖桿方向碼根據映射設定(WASD / DIRECTION)拆分為單一按鍵事件後以 controlType 傳遞。遊戲端的鍵盤輸入和搖桿輸入看起來格式相同。斜向移動也由主機拆分為兩個單鍵事件後發送。

範例 - 按下 'A' 鍵

{
    "version"   : "1.02.00",
    "eventType" : "Control",
    "eventValue": {
        "value": {
            "controlType" : "Key",
            "controlValue": { "value": "0x41", "action": "Down" }
        }
    },
    "etc"       : { }
}

範例 - 搖桿向上(WASD 映射時的 'W' 鍵)

{
    "version"   : "1.02.00",
    "eventType" : "Control",
    "eventValue": {
        "value": {
            "controlType" : "Key",
            "controlValue": { "value": "0x57", "action": "Down" }
        }
    },
    "etc"       : { }
}

controlType = "Click" - 滑鼠及觸控座標輸入

傳遞滑鼠點擊、滑鼠移動及觸控座標。Web 用戶端產生的滑鼠輸入和觸控輸入均會自動轉換為以 GetClientRect() 為基準的遊戲視窗用戶端區域像素座標後傳遞。

欄位
controlValue.value "x#y" 格式,單位為**遊戲視窗用戶端區域像素座標**(保留小數點後 1 位)。Web 用戶端的 0-1000 正規化座標在主機端轉換為像素後傳遞。
controlValue.action "Down""Up""Move"

Note

觸控輸入轉換為 Click 類型時,touchID 資訊不會被保留。

座標轉換參考

curWidth / curHeight 是以遊戲視窗 GetClientRect() 為基準的用戶端區域尺寸,因此在遊戲中可直接作為視窗座標使用。

Web 用戶端位置 正規化座標(inbound) 像素座標(curWidth=1053, curHeight=1585 範例)
左上 "0.0#0.0" "0.0#0.0"
右上 "1000.0#0.0" "1053.0#0.0"
左下 "0.0#1000.0" "0.0#1585.0"
右下 "1000.0#1000.0" "1053.0#1585.0"
中央 "500.0#500.0" "526.5#792.5"

範例 - 滑鼠點擊(Down -> Up)

{
    "version"   : "1.02.00",
    "eventType" : "Control",
    "eventValue": {
        "value": {
            "controlType" : "Click",
            "controlValue": { "value": "526.5#792.5", "action": "Down" }
        }
    },
    "etc"       : { }
}

{
    "version"   : "1.02.00",
    "eventType" : "Control",
    "eventValue": {
        "value": {
            "controlType" : "Click",
            "controlValue": { "value": "526.5#792.5", "action": "Up" }
        }
    },
    "etc"       : { }
}

範例 - 拖曳(Move)

{
    "version"   : "1.02.00",
    "eventType" : "Control",
    "eventValue": {
        "value": {
            "controlType" : "Click",
            "controlValue": { "value": "645.1#681.7", "action": "Move" }
        }
    },
    "etc"       : { }
}

controlType = "Wheel" - 滑鼠滾輪

傳遞滑鼠滾輪的捲動操作。

欄位
controlValue.value "x.0#y.0" 格式,為**滑鼠游標目前的像素座標**(以遊戲視窗用戶端區域為基準)。Web 用戶端發送的捲動步數資訊將遺失。
controlValue.action "Up"(向上捲動)或 "Down"(向下捲動)

範例 - 滾輪向下(滑鼠位置 1234.0 px, 567.0 px)

{
    "version"   : "1.02.00",
    "eventType" : "Control",
    "eventValue": {
        "value": {
            "controlType" : "Wheel",
            "controlValue": { "value": "1234.0#567.0", "action": "Down" }
        }
    },
    "etc"       : { }
}

controlType = "Zoom" - 放大/縮小

傳遞攝影機或地圖畫面的放大/縮小操作。

欄位
controlValue.value 固定為 "1"。Web 用戶端發送的縮放步數資訊將遺失。
controlValue.action "In"(放大)或 "Out"(縮小)

範例 - 放大

{
    "version"   : "1.02.00",
    "eventType" : "Control",
    "eventValue": {
        "value": {
            "controlType" : "Zoom",
            "controlValue": { "value": "1", "action": "In" }
        }
    },
    "etc"       : { }
}

範例 - 縮小

{
    "version"   : "1.02.00",
    "eventType" : "Control",
    "eventValue": {
        "value": {
            "controlType" : "Zoom",
            "controlValue": { "value": "1", "action": "Out" }
        }
    },
    "etc"       : { }
}

輸入類型轉換映射概述

以下是 Web 用戶端發送的原始輸入類型轉換為主機回呼事件的映射結構。

Web 用戶端輸入 回呼 controlType 主要轉換 / 資訊遺失
Key "Key" 直接使用 VK 16 進位值
Joystick "Key" 方向碼 -> WASD / DIRECTION 映射 -> 拆分為單鍵
Click "Click" 座標正規化 -> 像素轉換
Touch "Click" 座標正規化 -> 像素轉換,touchID 不傳遞(透過重複的 Down 判斷多點觸控)
Wheel "Wheel" 步數資訊 -> 替換為滑鼠像素座標
Zoom "Zoom" 步數資訊 -> 固定為 "1"

狀態(Event)/ 聊天(Message)事件不透過此 Control 事件傳遞,而是按照現有協議規範單獨傳遞。

遊戲端輸入處理指南

在 Hive Console 的 Remote Play 設定中啟用**不解除鎖定畫面即可遊玩**功能後,Remote Play 不會將輸入事件發送至 OS 輸入佇列,而是透過註冊的回呼直接傳遞給遊戲。

因此,回呼接收到的輸入事件需要直接傳遞給 Unity Input System 或 Unreal Input Subsystem 等遊戲內部輸入系統進行處理。

這種方式是為了繞過 Windows 鎖定畫面環境中 SendInputSendKey 等 OS 層級輸入注入受到限制的問題而設計的。由於輸入事件直接在遊戲程序內部分發,建議不區分鎖定畫面狀態和正常狀態,使用相同的處理路徑。

也就是說,啟用**不解除鎖定畫面即可遊玩**功能後,建議接收此回呼傳遞的所有輸入事件,並將其傳遞給遊戲內部輸入系統的方式進行實作。這樣可以確保無論鎖定畫面狀態如何,都能保證一致的輸入處理和遠端遊玩行為。

  • Unity:透過 InputSystem.QueueEvent 或自訂輸入管理器進行分發
  • Unreal Engine:透過 FSlateApplication::OnKeyDown / OnMouseButtonDown 等 Slate 事件進行分發,或使用遊戲自訂輸入管理器

鎖定畫面環境下的背景渲染與音訊處理指南

在 Windows 鎖定畫面環境中使用 Remote Play,需要遊戲在背景狀態下也能正常運行。許多遊戲引擎在失去焦點或切換至背景狀態時,會停止渲染或限制幀率以降低 CPU 使用率,並暫停音訊播放。為保證遠端串流正常運行,需要修改設定使遊戲程序在背景也能繼續運行。

1. 根據 Remote Play 連線狀態的建議策略

遊戲需要確認 Remote Play 的連線狀態,判斷是否有遠端使用者正在連線。建議的行為如下:

連線狀態 建議行為
未連線 維持現有遊戲策略,切換至背景時可停止渲染和音訊
連線中 在背景狀態下也維持渲染,在背景狀態下也維持音訊輸出

連線狀態可透過狀態事件回呼eventType: "Event",值 REMOTE_PLAY_CONNECTED / REMOTE_PLAY_DISCONNECTED)進行判斷。

2. 維持背景渲染

即使在鎖定畫面狀態下,Remote Play 也需要能夠擷取畫面,因此需要持續運行渲染循環。確認項目範例如下:

  • 不停止幀更新
  • 維持渲染循環
  • 維持攝影機渲染
  • 維持 UI 更新
  • 確認背景幀限制策略

Warning

若在背景狀態下停止渲染,Remote Play 將持續發送最後一幀畫面,或顯示黑色畫面。

3. 維持背景音訊輸出

Remote Play 會擷取遊戲程序輸出的音訊並分發給遠端玩家。因此,需要停用以下類型的背景音訊封鎖策略:

  • 失去焦點時暫停音訊
  • 視窗停用時停止 Audio Engine
  • 啟用背景靜音功能

Warning

若在背景狀態下停止音訊輸出,遠端玩家將無法聽到遊戲聲音。

各引擎注意事項與參考

Unity

Unity 在預設情況下,切換至背景時可能會限制更新。使用鎖定畫面 Remote Play 功能時,建議如下啟用背景執行:

Application.runInBackground = true;

如果存在失去焦點時停止音訊的自訂邏輯,請考慮 Remote Play 的連線狀態進行例外處理。

Unreal Engine

Unreal Engine 專案中也需要確認是否有限制失去焦點時的 Tick、渲染或音訊處理的設定。特別建議確認以下項目:

  • Background Tick 的運行狀況
  • Focus Lost 時的 Pause 處理情況
  • Audio Mixer 的運行狀況
  • 背景 FPS 限制策略

Remote Play 連線期間,需要實作即使在背景狀態下也能維持正常遊戲循環的方式。

建議操作情境

  1. 使用者切換至 Windows 鎖定畫面狀態
  2. Remote Play 用戶端連線
  3. 遊戲偵測到連線狀態,維持背景渲染和音訊輸出
    • 繼續遊戲渲染
    • 繼續遊戲音訊輸出
  4. Remote Play Plugin 正常擷取並發送畫面和音訊
  5. 遠端使用者即時接收遊戲畫面和聲音
  6. 輸入事件透過 Remote Play 輸入 Control 回呼傳遞給遊戲內部輸入系統

必要確認事項概述

若要在鎖定畫面環境中正常使用 Remote Play,需滿足以下兩個條件:

  • 需在 Hive Console 的 Remote Play 設定中啟用**不解除鎖定畫面即可遊玩**功能,並將輸入事件傳遞給遊戲內部輸入系統。
  • Remote Play 連線期間,即使在背景狀態下也需要維持渲染和音訊處理。

若任一條件不滿足,可能因畫面停止、聲音輸出錯誤、操作困難等問題導致無法正常運行。

相關文件