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;
}