Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OpenTK按键?_C#_Opengl_Opentk - Fatal编程技术网

C# OpenTK按键?

C# OpenTK按键?,c#,opengl,opentk,C#,Opengl,Opentk,我正在寻找一种跨平台(Win&MacOS)的方法来检测OpenGL应用程序C#中的按键 以下方法适用,但仅适用于字母数字字符 protected override void OnKeyPress(OpenTK.KeyPressEventArgs e) { if (e.KeyChar == 'F' || e.KeyChar == 'f') DoWhatever(); } 目前,我正在破解它,检测用户何时释放密钥: void HandleKeyUp (object send

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

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

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

改变一下你的想法,你就会看清楚

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

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


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

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