> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# IGameInput::GetPreviousReading

> IGameInput::GetPreviousReading

# IGameInput::GetPreviousReading

基于来自（可选筛选的）输入流的参考读数，检索上一个 [IGameInputReading](/reference/input/gameinput/interfaces/igameinputreading/igameinputreading)。

## 语法

```cpp theme={null}
HRESULT GetPreviousReading(
    IGameInputReading* referenceReading,
    GameInputKind inputKind,
    IGameInputDevice* device,
    IGameInputReading** reading
);
```

### 参数

*referenceReading*   \_In\_\
类型：IGameInputReading\*

返回的 `IGameInputReading` 接口是按顺序在此参考读数之前读取的。

*inputKind*   \_In\_\
类型：[GameInputKind](/reference/input/gameinput/enums/gameinputkind)

用于从中获取上一个读数的输入类型筛选器。`GameInputKind` 接口是一个标志变量。你可以组合多个值以按多个常量进行筛选。指定多种输入类型时，任何至少包含其中一种输入类型的读数都会被匹配并返回。

*device*   \_In\_opt\_\
类型：IGameInputDevice\*

用于从中获取上一个读数的特定设备筛选器。

*reading*   \_COM\_Outptr\_\
类型：IGameInputReading\*\*

在 `referenceReading` 输入之前按顺序返回的 `IGameInputReading` 接口。

### 返回值

类型：HRESULT

函数结果。

## 备注

[GetNextReading](/reference/input/gameinput/interfaces/igameinput/methods/igameinput_getnextreading) 和 [GetPreviousReading](/reference/input/gameinput/interfaces/igameinput/methods/igameinput_getpreviousreading) 方法允许应用逐个读数地遍历输入历史记录。

如果在 `referenceReading` 之后没有读数，或者提供的设备筛选器对应已断开连接的设备，或者由于时间过长导致参考读数与返回的读数已离开输入流历史缓冲区，则返回 `NULL` 值和失败的 `HRESULT`。对于持续处理输入的应用而言，超时错误很少见，因为输入流会在其历史缓冲区中为每个设备保留半秒的读数。

以下代码示例演示了如何从特定设备轮询所有游戏手柄状态。

```cpp theme={null}
Microsoft::WRL::ComPtr<IGameInput> gameInput;
Microsoft::WRL::ComPtr<IGameInputDevice> gamepad;
Microsoft::WRL::ComPtr<IGameInputReading> prevReading;

void PollGamepadInput() noexcept
{
    if (!prevReading)
    {
        if (SUCCEEDED(gameInput->GetCurrentReading(
            GameInputKindGamepad,
            nullptr,
            &prevReading)))
        {
            prevReading->GetDevice(&gamepad);

            // Application-specific code to process the initial reading
        }
    }

    else
    {
        Microsoft::WRL::ComPtr<IGameInputReading> nextReading;
        HRESULT hr = gameInput->GetNextReading(
            prevReading.Get(),
            GameInputKindGamepad,
            gamepad.Get(),
            &nextReading);

        if (SUCCEEDED(hr))
        {
            // Application-specific code to process the next reading

            prevReading = nextReading;
        }

        else if (hr != GAMEINPUT_E_READING_NOT_FOUND)
        {
            gamepad = nullptr;
            prevReading = nullptr;
        }
    }
}
```

## 要求

[GameInput](/reference/input/gameinput/gameinput_members)\
[GameInput 概述](/build/core-features/common/input/overviews/input-overview)\
[IGameInput\_GetCurrentReading](/reference/input/gameinput/interfaces/igameinput/methods/igameinput_getcurrentreading)\
[IGameInput\_GetNextReading](/reference/input/gameinput/interfaces/igameinput/methods/igameinput_getnextreading)\
[IGameInput](/reference/input/gameinput/interfaces/igameinput/igameinput)

## 版本历史

| 版本     | 变更  |
| ------ | --- |
| **v0** | 引入。 |


## Related topics

- [IGameInput::GetCurrentReading](/zh-CN/reference/input/gameinput/interfaces/igameinput/methods/igameinput_getcurrentreading.md)
- [IGameInput::GetNextReading](/zh-CN/reference/input/gameinput/interfaces/igameinput/methods/igameinput_getnextreading.md)
- [IGameInput::GetTemporalReading](/zh-CN/reference/input/gameinput/deprecated/interfaces/igameinput/methods/igameinput_gettemporalreading.md)
- [IGameInputReading::GetInputKind](/zh-CN/reference/input/gameinput/interfaces/igameinputreading/methods/igameinputreading_getinputkind.md)
- [IGameInputReading::GetDevice](/zh-CN/reference/input/gameinput/interfaces/igameinputreading/methods/igameinputreading_getdevice.md)
