GLUT跟踪按下的键(当用SHIFT键按下键并在没有键的情况下释放键时)

时间:2014-11-17 12:11:42

标签: c linux opengl glut keyboard-events

我正在尝试跟踪按下的按键。我有glutIgnoreKeyRepeat(1)并且我在一个跟踪按键的对象中注册了关键事件(正常和特殊的向下/向上)(从现在开始称为按键列表),这样我就可以检查如果通过查看该列表按下某个键,则显示功能。

问题 SHIFT 不同的密钥注册为DOWN和UP(取决于是否按下了SHIFT)对于相同的物理键盘键(例如 a A 1 [ {< / kbd>等。)

考虑这一点({kbd> key1 key2 }表示事件后我按下的键列表):

  • 初始状态:{}没有列出按键
  • SHIFT DOWN:{ SHIFT }
  • a DOWN:{ SHIFT A }(因为 SHIFT 仍在关闭,首都'A'注册作为关键。
  • SHIFT UP:{ A }
  • a UP:{ A }(因为未按下 SHIFT ,低'a'作为键注册,所以 a 从按下的键列表中删除(实际上不存在), A 仍然存在)
  • 最终状态:{ A },即使键盘上仍未按下任何键。

对于字母键我可以通过添加/删除键的小写( a 而不是 A )来解决这个问题。

但是 1 [ {glutGetModifiers在这里没有帮助。或者,如果按下一个键,窗口会失去焦点,释放键并且窗口再次获得焦点(当窗口失去焦点时没有事件告诉该键被释放)?

是否有通用解决方案来检查按键是否被按下? (平台相关的解决方案是可以的,另一个库不适合我,但可能适用于需要解决此问题的其他人)

1 个答案:

答案 0 :(得分:1)

你想要的是键码,键盘上按键的物理编号。这些在Apple和PC键盘上有所不同,在字母改变位置的其他国家的键盘上也可能不同。

大多数程序不关心密钥代码,它们需要实际的字母和修饰键,因此系统事件处理程序提供从键代码到预期字符/特殊键的转换。 GLUT设计为简单,便携和跨平台,因此使用这些例程。

如果您正在编写游戏或模拟器,只需降低所有内容即可。对于那种高速交互,大多数玩家不希望区分1和!,或2和@。 Ins / Del和箭头键块(通常)无论如何都没有多个符号,并且数字小键盘距离太远,大多数人不能同时按住修改键。

如果你确实需要跟踪每个关键状态,抱歉GLUT不适合你。在MacOS上,您向NSKeyEvent询问密钥代码,在MS Windows上使用DirectX,在Linux上使用XKeyPress | ReleaseEvent密钥代码。

希望这有帮助。