我正在尝试跟踪按下的按键。我有glutIgnoreKeyRepeat(1)
并且我在一个跟踪按键的对象中注册了关键事件(正常和特殊的向下/向上)(从现在开始称为按键列表),这样我就可以检查如果通过查看该列表按下某个键,则显示功能。
问题是 SHIFT :不同的密钥注册为DOWN和UP(取决于是否按下了SHIFT)对于相同的物理键盘键(例如 a 和 A , 1 和!, [和 {< / kbd>等。)
考虑这一点({kbd> key1 key2 }表示事件后我按下的键列表):
对于字母键我可以通过添加/删除键的小写( a 而不是 A )来解决这个问题。
但是 1 和!或 [和 {。 glutGetModifiers
在这里没有帮助。或者,如果按下一个键,窗口会失去焦点,释放键并且窗口再次获得焦点(当窗口失去焦点时没有事件告诉该键被释放)?
是否有通用解决方案来检查按键是否被按下? (平台相关的解决方案是可以的,另一个库不适合我,但可能适用于需要解决此问题的其他人)
答案 0 :(得分:1)
你想要的是键码,键盘上按键的物理编号。这些在Apple和PC键盘上有所不同,在字母改变位置的其他国家的键盘上也可能不同。
大多数程序不关心密钥代码,它们需要实际的字母和修饰键,因此系统事件处理程序提供从键代码到预期字符/特殊键的转换。 GLUT设计为简单,便携和跨平台,因此使用这些例程。
如果您正在编写游戏或模拟器,只需降低所有内容即可。对于那种高速交互,大多数玩家不希望区分1和!,或2和@。 Ins / Del和箭头键块(通常)无论如何都没有多个符号,并且数字小键盘距离太远,大多数人不能同时按住修改键。
如果你确实需要跟踪每个关键状态,抱歉GLUT不适合你。在MacOS上,您向NSKeyEvent询问密钥代码,在MS Windows上使用DirectX,在Linux上使用XKeyPress | ReleaseEvent密钥代码。
希望这有帮助。