# Input

`Input`这个静态类型用来提供输入功能。基本的输入系统并不是基于事件绑定的，而是采用轮询的方式。这部分内容比较直观，一般来说看函数名就知道用法，但也会有几个坑。

## Key Reading

There's a number of useful methods that detect keys being pressed down in different ways, all seeming to return a 'bool'. Most common are `IsKeyDown`, `IsKeyPressed` and `IsKeyReleased`

You can call them like so: `Input.IsKeyDown(InputKey.TheKeyCode)`. See here for a list of all keycodes: [link](/bannerlord-modding-cn/_csharp-api/inputsystem/input.md#key-codes)

You can also use the extension methods `IsDown`/`IsPressed`/`IsReleased` as such `KeyCode.A.IsPressed()`

Below, you may find an in-depth documentation of each.

#### Namespace

This page assumes an import like so: `using TaleWorlds.InputSystem;`

### public static bool Input.IsKeyDown([InputKey](/bannerlord-modding-cn/_csharp-api/inputsystem/input.md#key-codes) key)

This checks to see if the specified \[key] is currently being pressed, it returns true as long as the \[key] is held down.

Example:

```csharp
   if(Input.IsKeyDown(InputKey.Y))
   {

       //doSomething

   }
```

### public static bool Input.IsKeyDownImmediate([InputKey](/bannerlord-modding-cn/_csharp-api/inputsystem/input.md#key-codes) key)

This acts as an intermediary check between `IsKeyDown` and `IsKeyPressed`

Example:

```csharp
    if(Input.IsKeyDownImmediate(InputKey.Y))
    {

        //doSomething

    }
```

### public static bool Input.IsKeyPressed([InputKey](/bannerlord-modding-cn/_csharp-api/inputsystem/input.md#key-codes) key)

This checks to see if the specified \[key] has been pressed, it returns a bool once.

Example:

```csharp
    if(Input.IsKeyPressed(InputKey.Y))
    {

        //doSomething

    }
```

### public static bool Input.IsKeyReleased([InputKey](/bannerlord-modding-cn/_csharp-api/inputsystem/input.md#key-codes) key)

This checks to see if the specified \[key] is not currently being pressed, it returns a bool once.

Example:

```csharp
    if(Input.IsKeyReleased(InputKey.Y))
    {

        //doSomething

    }
```

#### To see how one could document the stages of a key using the above 3 methods: [example](/bannerlord-modding-cn/_csharp-api/inputsystem/input.md#monitoring-a-keys-state)

### public static bool Input.IsControlOrShiftNotDown()

I do not believe there is any other method more self-explanatory than this. Returns true while neither Control or Shift are down.

### public static bool Input.IsPressed([InputKey](/bannerlord-modding-cn/_csharp-api/inputsystem/input.md#key-codes) key)

Checks to see if a they specified \[key] is currently pressed. Unlike IsDown, it can be used as Input.IsPressed() but not as an extension.

### public static Vector2 Input.GetKeyState([InputKey](/bannerlord-modding-cn/_csharp-api/inputsystem/input.md#key-codes) key)

Checks and returns the current state of the specified \[key] as a Vector2. I am not aware how this can be used.

Example:

```csharp
  using System.Numerics; // WARNING, this assumes the existance of System.Numerics.Vectors.dll,
                         // which has to be installed manually.
  using Taleworlds.InputSystem;

  Vector2 test = new Vector2(Input.GetKeyState(InputKey.A));

  Vector2 compare = new Vector2(10, 10);

  if (Equals(test, compare))
    InformationManager.DisplayMessage(new InformationMessage("Help please I'm forced to write this doc!"));
```

### public static string Input.GetKeyboardText()

Returns the text currently existing in the user's clipboard as a string.

### public static bool Input.IsMouseActive

Checks to see if the mouse is currently active, if so returns `true`.

### public static bool Input.IsMouseScrollChanged

Checks to see if the mouse scroll wheel is currently rotating, if so returns `true`.

### public static float Input.MouseMoveX

Returns the horizontal position of the mouse as a float.

### public static float Input.MouseMoveY

Returns the vertical position of the mouse as a float.

## Examples

### Monitoring a key's state

```csharp
  protected override void OnApplicationTick(float dt)
  {
    int x = 0;
    int y = 0;
    int z = 0;
    //If X has been pressed, increment x by 1
    if(Input.IsKeyPressed(InputKey.X))
      x++;
    //For each tick that X is being held down, increment y by 1
    if(Input.IsKeyDown(InputKey.X))
      y++;
    //For each tick that X is untouched, increment z by 1
    if(Input.IsKeyReleased(InputKey.X))
      z++;
  }
```

## Key Codes

As of Bannerlord 1.2.1 the following key codes are available:

```csharp
public enum InputKey
{
    Invalid,
    Escape,
    D1,
    D2,
    D3,
    D4,
    D5,
    D6,
    D7,
    D8,
    D9,
    D0,
    Minus,
    Equals,
    BackSpace,
    Tab,
    Q,
    W,
    E,
    R,
    T,
    Y,
    U,
    I,
    O,
    P,
    OpenBraces,
    CloseBraces,
    Enter,
    LeftControl,
    A,
    S,
    D,
    F,
    G,
    H,
    J,
    K,
    L,
    SemiColon,
    Apostrophe,
    Tilde,
    LeftShift,
    BackSlash,
    Z,
    X,
    C,
    V,
    B,
    N,
    M,
    Comma,
    Period,
    Slash,
    RightShift,
    NumpadMultiply,
    LeftAlt,
    Space,
    CapsLock,
    F1,
    F2,
    F3,
    F4,
    F5,
    F6,
    F7,
    F8,
    F9,
    F10,
    Numpad7,
    Numpad8,
    Numpad9,
    NumpadMinus,
    Numpad4,
    Numpad5,
    Numpad6,
    NumpadPlus,
    Numpad1,
    Numpad2,
    Numpad3,
    Numpad0,
    NumpadPeriod,
    Extended,
    F11,
    F12,
    NumpadEnter,
    RightControl,
    NumpadSlash,
    RightAlt,
    NumLock,
    Home,
    Up,
    PageUp,
    Left,
    Right,
    End,
    Down,
    PageDown,
    Insert,
    Delete,
    ControllerLStick,
    ControllerRStick,
    LeftMouseButton,
    RightMouseButton,
    MiddleMouseButton,
    X1MouseButton,
    X2MouseButton,
    MouseScrollUp,
    MouseScrollDown,
    ControllerLStickUp,
    ControllerLStickDown,
    ControllerLStickLeft,
    ControllerLStickRight,
    ControllerRStickUp,
    ControllerRStickDown,
    ControllerRStickLeft,
    ControllerRStickRight,
    ControllerLUp,
    ControllerLDown,
    ControllerLLeft,
    ControllerLRight,
    ControllerRUp,
    ControllerRDown,
    ControllerRLeft,
    ControllerRRight,
    ControllerLBumper,
    ControllerRBumper,
    ControllerLOption,
    ControllerROption,
    ControllerLThumb,
    ControllerRThumb,
    ControllerLTrigger,
    ControllerRTrigger,
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://yigu-studio.gitbook.io/bannerlord-modding-cn/_csharp-api/inputsystem/input.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
