【问题标题】:Multiple keys are not working多个键不起作用
【发布时间】:2016-02-10 08:23:40
【问题描述】:

我在使用freeglut 函数时遇到了按键问题。除ctrl+alt+D 外,所有键都工作正常。我不知道为什么它不工作我做错了什么。
这是代码:

#include<iostream>
#include<cstdlib>
#include <GL\freeglut.h>
using namespace std;

void Display(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glEnd();
    glFlush();
}

void SpecialKeys(int key, int xpos, int ypos) {

    if (key == GLUT_KEY_UP) {
        cout << "up key press" << endl;
    }

    else if (key == GLUT_KEY_DOWN) {

        cout << "down key press" << endl;
    }

    else if (key == GLUT_KEY_RIGHT) {

        cout << "Right key press" << endl;

    }
    else if (key == GLUT_KEY_LEFT) {

        cout << "left key press" << endl;

    }
    glutPostRedisplay();
}

void KeysFun(unsigned char key, int xpos, int ypos) {

    if (key == 'a' || key == 'a') {
        cout << "A Key press" << endl;
    }

    else if (key == 's' || key == 'S') {

        int mod = glutGetModifiers();

        if (mod == GLUT_ACTIVE_ALT) {

            cout << "Alt+S press" << endl;
        }

    }

    else if (key == 'd' || key == 'D') {

        int mod = glutGetModifiers();
        int mod2 = glutGetModifiers();
        if (mod == GLUT_ACTIVE_CTRL && mod2== GLUT_ACTIVE_ALT) {

            cout << "CTRL+Alt+D press" << endl;
        }

    }

    glutPostRedisplay();
}

void init(void) {

    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);

}


int main(int argc, char**argv) {

    glutInit(&argc, argv);
    glutCreateWindow("Frame");
    init();
    glutDisplayFunc(Display);
    glutKeyboardFunc(KeysFun);
    glutSpecialFunc(SpecialKeys);
    glutMainLoop();

    return EXIT_SUCCESS;
}

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    当您按下 CTRL+D 时,key 不等于 'd' or 'D' 它等于 EOT 传输结束并等于此 key == 0x04(更多 info here)所以您需要添加到您的 if 表达式中 else

    if (key == 'd' || key == 'D' || key == 0x04)
    

    接下来,当您同时按下 ALT 和 CTRL 时,glutGetModifiers() 将返回以下任何符号位掩码的组合:GLUT_ACTIVE_CTRL GLUT_ACTIVE_ALT... 更多 info here

    如果阻止按钮 d 按下可能如下所示:

    else if (key == 'd' || key == 'D' || key == 0x04) {
        int mod = glutGetModifiers();
        if (mod == (GLUT_ACTIVE_CTRL|GLUT_ACTIVE_ALT)) {
          cout << "CTRL+Alt+D press" << endl;
        }
    }
    

    在 Linux 上为我工作。

    【讨论】:

    • Control-D 不应该在 MS Windows 上导致 EOT(参见 #include 中的反斜杠),至少在我知道的任何 shell 上都不会。我仍然很好奇这是否有助于解决问题。
    • @segvara 我可以在其中找到这些键的代码,例如 D 的 0x04
    • @segvara 什么是eot?
    • @hamel123 我确信这意味着如 Ulrich Eckhardt 提到的 Windows 操作系统的 EOT,但您可以找到代码,例如here 有关传输结束字符的信息,您可以找到 here
    • @segvara 我正在使用该代码,但它不起作用 Ctrl+Alt+D 没有打印我正在使用 Windows
    【解决方案2】:

    我没有这方面的代码,但您可以设置按键回调,如果另一个按键被按下但未释放,那么您有您的情况。 GLFW 支持键回调,这是应该使用的方法。但是我不知道freeGLUT,但它应该实现关键回调。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2019-08-12
      • 2022-01-21
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多