从 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 回调函数中寻找未修改的键盘输入的主要内容,如果未能解决你的问题,请参考以下文章

在 glutKeyboardFunc 中进行的 OpenGL 状态更改不会立即可见

将成员函数指针转换为 FreePascal 中的函数指针

Raft 迷雾中寻支点

如何从 Graphql 解析函数中的回调返回值?

如何创建从回调函数返回承诺的函数[重复]

从 finally 块调用回调函数时出现问题