【问题标题】:GLUT keeping track of pressed keys (when a key was pressed with SHIFT and released without it)GLUT 跟踪按下的键(当一个键被 SHIFT 按下并在没有它的情况下释放)
【发布时间】:2014-11-17 12:11:41
【问题描述】:

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

问题在于 SHIFT不同的键注册为 DOWN 和 UP(取决于是否按下了 SHIFT)对于相同的物理键盘键(例如。 aA1![{ 等)

考虑一下({key1 key2} 代表我在事件发生后按下的按键列表):

  • 初始状态:{} 没有键被列为按下
  • SHIFT 向下:{SHIFT}
  • a DOWN : {SHIFT A} (因为 SHIFT 仍然向下,大写的“A”注册为键下来。
  • SHIFT 上移:{A}
  • a UP: {A} (因为 SHIFT 没有按下,较低的 'a' 注册为向上键,所以 a 被从按下的键列表中删除(实际上不存在),并且 A 仍然存在)
  • 最终状态:{A},即使键盘上仍然没有按下任何键。

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

但是 1![{ 呢? glutGetModifiers 在这里没有帮助。或者如果按下一个键,窗口失去焦点,释放该键,窗口又获得焦点(没有事件告诉窗口失去焦点时释放了键)?

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

【问题讨论】:

  • 检查this解决方案。
  • @Skynet 使用另一个库或 windows api。对我没有帮助,但还是谢谢。
  • 好的,抱歉没检查

标签: c linux opengl glut keyboard-events


【解决方案1】:

您想要的是键码,即在键盘上按下的键的物理编号。这些在 Apple 和 PC 键盘上有所不同,并且在字母位置发生变化的其他国家/地区的键盘上也可能有所不同。

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

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

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

希望这会有所帮助。

【讨论】:

  • RE:“你使用 DirectX 的 MS Windows”。实际上,不要。 DirectInput 不应用于现代版本的 Windows(即 Windows 9x/ME 以外的任何设备)上的鼠标或键盘。只需使用WM_KEYDOWNWM_KEYUP,或者在您的情况下使用GetAsyncKeyState
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多