opengl键盘回调函数不能获取Ctrl+c的问题

我要令窗口在按下 Ctrl+c 之后关闭。
关键代码如下:


/* 这段代码位于键盘回调函数中 */
if ((glutGetModifiers() == GLUT_ACTIVE_CTRL) && (key == 'c' || key == ‘C’))
{
   exit(0);
}

但是我按下ctrl+c之后没有反应。
我的操作系统是 ubuntu 12。
出现这个问题的原因是加上 Ctrl 键之后,key大值发生了变化。
比如说 a 的 Ascii 码值是 97,但是 Ctrl+A 之后变成了 1。
我们可以试验一下。
由于在命令行中按下 Ctrl+key 会发生许多奇奇怪怪的事情,比如 Ctrl+z 暂停程序,Ctrl+d 结束输入,Ctrl+i 制表符,等。而在图形窗口中就没有这个问题,所以我们直接在刚才写的 opengl 程序中察看。
将下列代码插入键盘回调函数中:


int modifier = glutGetModifiers();
printf("modifier: %d\n", modifier);
printf("key: %d\n", (int)key); /* 注意要将 key 转化为 int 型,因为某些 char 是不能显示的。 */

运行之后,我们按下 a,会出现:(无修饰键时 modifier 为 0)

modifier: 0
key: 97

按下 Ctrl+a,会出现:(修饰键为 Ctrl 时 modifier 为 2)

modifier: 2
key: 1

读者可以多试验一下。值得注意的是 Ctrl+a 与 Ctrl+A 的 key 值是一样的。
我自己从 Ctrl+A 一路按到 Ctrl+Z,显示的值是 1 到 26。我也试验过 Shift 和 Alt 修饰键,它们没有这种效果。
好了进入正题。我们看到,当使用 Ctrl+c 时,key 的值不再是 'c',而是 '\x03'。所以修改代码如下:


if ((glutGetModifiers() == GLUT_ACTIVE_CTRL) && (key == 'c' || key == ‘C’ || key == '\x03'))
{
   exit(0);
}

编译运行,最后达到了想要的效果。

我是在 ubuntu 中试验的,并不知道其它操作系统是个什么情况。

posted on 2015-07-26 22:47  bfbrmt  阅读(1197)  评论(0编辑  收藏  举报

导航