C# OpenTK按键?
我正在寻找一种跨平台(Win&MacOS)的方法来检测OpenGL应用程序C#中的按键 以下方法适用,但仅适用于字母数字字符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
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()似乎返回一些专有的键代码