OpenTK 按键?

Posted

技术标签:

【中文标题】OpenTK 按键?【英文标题】:OpenTK keypress? 【发布时间】:2016-04-05 09:03:27 【问题描述】:

我正在寻找一种跨平台(Win 和 MacOS)方法来检测 C# 中用于 OpenGL 应用程序的按键。

以下方法有效,但仅适用于字母数字字符。

protected override void OnKeyPress(OpenTK.KeyPressEventArgs e)

    if (e.KeyChar == 'F' || e.KeyChar == 'f')
        DoWhatever();

目前,我正在破解它,检测用户何时释放键:

void HandleKeyUp (object sender, KeyboardKeyEventArgs e)

    if (e.Key == Key.Tab)
        DoWhatever();

使用 OpenTK.Input,我可以测试是否正在按住某个键,但我只是在初始按键之后。

var state = OpenTK.Input.Keyboard.GetState();

if (state[Key.W])
    DoWhatever();

那么,OpenTK 用户使用哪些方法来注册按键?

解决方案

按照 Gusman 的建议,只需将当前键盘状态与前一个主循环的状态进行比较即可。

KeyboardState keyboardState, lastKeyboardState;

protected override void OnUpdateFrame(FrameEventArgs e)

    // Get current state
    keyboardState = OpenTK.Input.Keyboard.GetState();

     // Check Key Presses
    if (KeyPress(Key.Right))
            DoSomething();

    // Store current state for next comparison;
    lastKeyboardState = keyboardState;


public bool KeyPress(Key key)

    return (keyboardState [key] && (keyboardState [key] != lastKeyboardState [key]) );

【问题讨论】:

【参考方案1】:

稍微改变一下你的想法,你就会清楚地看到它。

您正在编写一个 OpenGL 应用程序,因此您有一个主循环,您可以在其中更新和渲染您的对象。

如果在该循环中您获得了键盘状态,并与之前存储的状态进行比较,则您有所有键盘更改,那么很容易通过键更改触发您自己的事件(或只是调用函数)。

通过这种方式,您将使用 OpenTK 的固有机制,并且 100% 可移植。

【讨论】:

虽然这是基本使用的有效解决方案,但当您想在 opengl 应用程序中提供 unicode 或非英语键盘输入时,这将不起作用:/ @Tyron 不确定 unicode,但它适用于其他语言,我一直用西班牙语使用它,从未失败过,你只需要知道 enum 和 key 之间的真实映射。 哦,你从哪里得到从枚举到键的映射? @Tyron 如果我没记错的话,它是使用 ToUnicode 函数将虚拟键码映射到 unicode 字符。 一些谷歌搜索只通过 p/invoke on user32.dll 找到了一个 ToUnicode 方法,这在 macos 上不起作用。 Plus Keyboard.GetState() 似乎返回了一些专有的键码

以上是关于OpenTK 按键?的主要内容,如果未能解决你的问题,请参考以下文章

按键精灵按键执行对应代码

按键抖动的处理方法(按键外部中断)

请教如何通过代码获取Canvas

按键响应onKeyDown,onKeyLongPress,onKeyUp

Android 屏蔽下方虚拟按键

按键精灵