LampArray 回呼,以及如何與 ILampArray 和 ILampInfo 執行個體互動。
截至 2023 年 3 月復原版本,GDK 照明 API 在主機上僅支援下列裝置。未來的復原版本將會新增對其他裝置的支援。
- Razer Turret for XBOX One (鍵盤和滑鼠)
- Razer BlackWidow Tournament Edition Chroma V2
ILampArray 和 ILampInfo
連線至系統的每個相容照明裝置都以 ILampArray 執行個體表示。ILampArray 提供裝置的相關資訊,例如其尺寸、裝置類型、製造商和 Lamp 數目。它也會公開變更其 Lamp 亮度和色彩值的方法。
ILampInfo 物件封裝 LampArray 中個別 Lamp 的屬性,包括 Lamp 的相對位置、色彩支援和預期用途。可以使用 ILampArray::GetLampInfo 擷取 ILampInfo 執行個體。
與圖形、音訊和 GameInput API 一樣,ILampArray 和 ILampInfo 不是真正的 COM API,即使它們公開衍生自 IUnknown 的介面。這種 API 樣式有時稱為「COM lite」或「nano-COM」。雖然 IUnknown 用於參考計數和反映,但 ILampArray 和 ILampInfo 不會使用 COM 執行階段基礎結構。具體而言,這表示下列事項:
- 應用程式不會呼叫
CoInitialize或CoCreateInstance來取得物件執行個體。 - 不支援彙總和呼叫端提供的介面實作等 COM 功能。
- 沒有跨處理序封送處理支援,也沒有 Apartment/執行緒模型。所有物件都是 Agile 物件。
- 可以直接比較介面指標以判斷物件身分識別,而不需透過
IUnknown。 - 方法不需要傳回
HRESULT代碼,這通常會產生更簡單的函式簽章。
LampArray 回呼
LampArray 回呼是取得 ILampArray 執行個體,以及在 LampArrays 連接至系統或從系統移除時收到通知的機制。
RegisterLampArrayStatusCallback
針對
LampArray 回呼,請使用 RegisterLampArrayStatusCallback 函式,而非 RegisterLampArrayCallback。回呼執行緒
如果在以LampArrayEnumerationKind::Blocking 註冊 LampArrayStatusCallback 時已連接任何 LampArray 裝置,RegisterLampArrayStatusCallback 函式將會封鎖,直到針對每個已連接的裝置叫用該回呼為止 (這表示回呼會在呼叫執行緒上叫用)。
註冊第一個回呼時,LampArray API 會啟動背景工作執行緒,以處理 ILampArray 裝置連接和移除通知。這些事件並不常發生,背景工作執行緒在其他時候會維持等候狀態。註冊呼叫傳回後,所有後續的 LampArrayStatusCallbacks 都會在此背景工作執行緒上依序叫用。在以 LampArrayEnumerationKind::Async 註冊 LampArrayStatusCallback 時已連線的裝置,也會在背景工作執行緒上處理。
可以使用 TrySetLampArrayWorkerThreadAffinityMask 控制 LampArray 背景工作執行緒的處理器親和性。每個處理序最多只能呼叫此 API 一次。對此 API 的任何後續呼叫都不會生效。
取消註冊回呼
成功註冊回呼之後,應用程式必須保證執行回呼所需的任何資源都保持有效。這包括回呼程式碼所使用的資源,以及回呼函式本身,例如,如果回呼函式裝載於應用程式視需要載入和卸載的 DLL 中。 若要安全地回收這些資源,應用程式必須先將從 RegisterLampArrayStatusCallback 方法收到的權杖傳遞至 UnregisterLampArrayCallback 方法,以取消註冊回呼。不支援從已註冊的LampArray 回呼內部取消註冊 LampArray 回呼,嘗試這麼做將會終止處理序。
