True keyboard input

One thing you can use is the games Window.TextInput event added in version 3.2. This (from what I know) hooks directly into openTK’s keyboard events, or the low level system hooks in windows. The output argument is a TextInputEventArgs which contains the character entered.

The only downside is that on the OpenGL platform, you need to manually listen for special keys such as backspace and tab via a polling system. What I would recommend is having a method fired by the window, which fires a custom event that takes the TextInputEvent args and simply passes it on. This way when your polling recognizes a special character, it simply fires off the with the special character (ex ‘\t’ or ‘\b’).

In the end, you have a system like this:

EventHandler<TextInputEventArgs> onTextEntered;
KeyboardState _prevKeyState;

...

protected override Initialize()
{
    #if OpenGL
    Window.TextInput += TextEntered;
    onTextEntered += HandleInput;
    #else
    Window.TextInput += HandleInput;
    #endif
}

private void TextEntered(object sender, TextInputEventArgs e)
{
    if(onTextEntered != null)
        onTextEntered.Invoke(sender, e);
}

private void HandleInput(object sender, TextInputEventArgs e)
{
    char charEntered = e.Character;
    // Do stuff here
}

protected override void Update(GameTime gameTime)
{
    KeyboardState keyState = Keyboard.GetState();

    #if OpenGL
    if (keyState.IsKeyDown(Keys.Back) && _prevKeyState.IsKeyUp(Keys.Back))
    {
        _textInput.Invoke(this, new TextInputEventArgs('\b'));
    }
    if (keyState.IsKeyDown(Keys.Enter) && _prevKeyState.IsKeyUp(Keys.Enter))
    {
        _textInput.Invoke(this, new TextInputEventArgs('\r'));
    }

    ... // Handle other special characters here (such as tab )
    #endif

    _prevKeyState = keyState;
}
2 Likes