IGameInput::RegisterReadingCallback
注意
この関数はまだ実装されていません。
新しい読み取り値が入力ストリームに到着したときに呼び出される関数を登録します。
構文
HRESULT RegisterReadingCallback(
IGameInputDevice* device,
GameInputKind inputKind,
float analogThreshold,
void* context,
GameInputReadingCallback callbackFunc,
GameInputCallbackToken* callbackToken
)
パラメーター
device _In_opt_
型: IGameInputDevice*
登録されたコールバックを特定のデバイスのトリガーのみに制限します。
inputKind _In_
型: GameInputKind
登録されたコールバックを、指定された入力の種類の 1 つ以上をサポートするデバイスのトリガーのみに制限します。
analogThreshold_In_
型: float
コールバックをトリガーするために、読み取り値内の少なくとも 1 つのアナログ値で必要な最小デルタを指定します。
context _In_opt_
型: void*
コールバック関数に関連する情報を提供するいくつかのオブジェクト。 通常は、呼び出し元のオブジェクトです。
callbackFunc_In_
型: GameInputReadingCallback
タイトル定義コールバック関数。
callbackToken _Result_zeroonfailure_
型: GameInputCallbackToken*
登録されているコールバック関数を識別するトークン。 このトークンは、コールバック関数を取り消すか登録解除する場合に登録されている関数を識別するために使用されます。
戻り値
型: HRESULT
この関数はまだ実装されていません。 E_NOTIMPL を返します。
解説
コールバックを登録しても、指定された入力フィルターに一致する最新の読み取り値で初期コールバックがディスパッチされることはありません。 後続の状態変化についてコールバックがディスパッチされるだけです。
次の C++ サンプルでは、特定のデバイスからイベントベースのゲームパッドの状態を取得する方法を示します。
Microsoft::WRL::ComPtr<IGameInput> gameInput;
Microsoft::WRL::ComPtr<IGameInputReading> prevReading;
void CALLBACK OnGamepadReading(
_In_ GameInputCallbackToken callbackToken,
_In_ void * context,
_In_ uint64_t timestamp,
_In_ IGameInputDevice * device,
_In_ IGameInputReading * reading,
_In_ bool hasOverrunOccurred)
{
if (prevReading && !hasOverrunOccurred)
{
// Application-specific code to process the
// deltas between 'reading' and 'prevReading'
}
else
{
// Application-specific code to process the
// reading as an initial (standalone) reading
}
prevReading = reading;
}
void WaitForReadingsWorker(
_In_ AsyncQueueHandleT queue,
_In_ IGameInputDevice * gamepad,
_In_ volatile bool & cancelWait) noexcept
{
bool enumerationComplete = false;
GameInputCallbackToken token;
if (SUCCEEDED(gameInput->RegisterReadingCallback(
queue,
GameInputKindGamepad,
gamepad,
0.0,
nullptr,
OnGamepadReading,
&token)))
{
while (!cancelWait)
{
DispatchAsyncQueue(queue, AsyncQueueCallbackType_Completion, 100);
}
gameInput->UnregisterCallback(token, 5000);
}
}
次の C++ サンプルでは、イベントを使用して、アクション マッピング UI のゲームパッドとキーボードからの入力を監視する方法を示します。
Microsoft::WRL::ComPtr<IGameInput> gameInput;
Microsoft::WRL::ComPtr<IGameInputReading> initialReading;
Microsoft::WRL::ComPtr<IGameInputReading> changedReading;
Microsoft::WRL::ComPtr<IGameInputDevice> changedDevice;
void CALLBACK OnReading(
_In_ GameInputCallbackToken callbackToken,
_In_ void * context,
_In_ uint64_t timestamp,
_In_ IGameInputDevice * device,
_In_ IGameInputReading * reading,
_In_ bool hasOverrunOccurred)
{
if (SUCCEEDED(gameInput->GetPreviousReading(
reading,
GameInputKindGamepad | GameInputKindKeyboard,
device,
&initialReading)))
{
changedDevice = device;
changedReading = reading;
}
}
bool WaitForAnyInput(
_In_ AsyncQueueHandleT queue,
_In_ uint32_t timeout,
_In_ float analogThreshold) noexcept
{
bool inputFound = false;
GameInputCallbackToken token;
if (SUCCEEDED(gameInput->RegisterReadingCallback(
queue,
GameInputKindGamepad | GameInputKindKeyboard,
nullptr,
analogThreshold,
nullptr,
OnReading,
&token)))
{
inputFound = DispatchAsyncQueue(
queue,
AsyncQueueCallbackType_Completion,
timeout);
gameInput->UnregisterCallback(token, 5000);
}
return inputFound;
}
要件
ヘッダー: GameInput.h
ライブラリ: xgameruntime.lib
サポートされているプラットフォーム: Windows、Xbox One ファミリー本体、Xbox Series 本体
関連項目
入力 API の概要
IGameInput
IGameInput::UnregisterCallback
IGameInput::StopCallback