从 glutKeyboardFunc 回调函数中寻找未修改的键盘输入
Posted
技术标签:
【中文标题】从 glutKeyboardFunc 回调函数中寻找未修改的键盘输入【英文标题】:Looking for unmodified keyboard input from glutKeyboardFunc callback function 【发布时间】:2013-08-28 19:15:32 【问题描述】:我已经有一段时间没有使用 Glut 进行键盘输入处理了,但我觉得键盘回调函数曾经提供了一个未修改的 Key 参数——我可能记错了。
换句话说,按“r”返回小写“r”字符,而按 SHIFT +“r”仍然返回小写“r”而不是大写“R”。现在情况并非如此(也许从未如此),因为使用修饰键(SHIFT、CONTROL、ALT)实际上会修改发送到回调函数的键。我一直在尝试找到一种方法来获取原始的 未修改 值,但此后没有运气。
有没有办法从回调函数中访问未修改的键盘值,或者我需要找到一种方法来手动反转修改以获得正确的键值?
glutKeyboardFunc(keyDown);
...
void Game::keyDown(unsigned char key, int mouseX, int mouseY)
switch (key)
case 'r':
cout<<"Called when 'r' is pressed"<<endl;
cout<<"Is NOT called when SHIFT is the modifier"<<endl;
break;
case 'R':
cout<<"Called ONLY when 'r' is pressed with SHIFT"<<endl;
cout<<"Is NOT called when 'r' is pressed on its own"<<endl;
break;
case 18:
cout<<"Called ONLY when 'r' is pressed with CONTROL"<<endl;
cout<<"Is NOT called when 'r' is pressed on its own"<<endl;
break;
任何帮助或建议将不胜感激。
【问题讨论】:
【参考方案1】:您正在寻找此功能:
int glutGetModifiers(void);
您可以将结果分配给一个整数并使用以下内容进行检查:
GLUT_ACTIVE_SHIFT
GLUT_ACTIVE_CTRL
GLUT_ACTIVE_ALT
一个小例子
int modifier = glutGetModifiers();
if (modifier == GLUT_ACTIVE_CTRL)
//code
else
//code
另请注意,该函数只能在处理键盘或鼠标输入事件的函数内部调用。
【讨论】:
我以前使用过这种方法,但是在这种特殊情况下存在问题。如果 ascii 表上的 'r' = 114,并且按住 SHIFT 给我的 'R' 是 82,理论上我可以发现按住 shift 会将给定字母修改 32,然后向后工作。但这不适用于像 '0' 和 ')' 这样的东西,因为两者之间的差异是 (48 - 41 = ) 7。同样,'1' 和 '!'不是7,而是17!最后,对于每个特定场景,我必须有几十个“if”语句,这有点多余,因为我可以为每个我希望使用的 ascii 值做一个案例以上是关于从 glutKeyboardFunc 回调函数中寻找未修改的键盘输入的主要内容,如果未能解决你的问题,请参考以下文章