首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C语言中的键盘捕获

C语言中的键盘捕获
EN

Stack Overflow用户
提问于 2012-06-26 09:02:37
回答 4查看 2.7K关注 0票数 1

所以我在想如何用C语言捕捉键盘活动。我们都知道,我们可以输入一些东西,然后按回车键,输入我们想要发送到计算机的任何东西。但第一个问题是,如何输入一些无法输入的字符,如向上键、向下键(特别是这两个人,因为我使用的是Linux,但我想用它们来做一些不同于其默认含义的事情)、shift、ctrl或其他任何字符。第二,如何让程序在我们按下任何键之后立即继续,这样我们就不需要一直进入和进入。(它类似于Windows中的“按任意键继续”)。

EN

回答 4

Stack Overflow用户

发布于 2012-06-26 09:24:13

有两种方法。

使用stty命令。

在使用getchar()

  • for之前,您可以添加
  • 更多详细信息,请访问man stty

使用termios.h here

你应该像这样改变你的tty的模式,更多细节,newt.c_lflag &= ~(ICANON | ECHO);

  • for man termios.h

票数 2
EN

Stack Overflow用户

发布于 2012-06-26 17:02:52

在DOS时代,有一个kbhit()函数。如果你需要这个功能,你可以看看这个线程:kbhit() for linux

我依稀可见地记得尝试过用户Thantos的功能,它工作得相当好。

我建议您先阅读tcgetattr()tcsetattr()的功能。

票数 1
EN

Stack Overflow用户

发布于 2012-06-26 09:06:02

“通用”方法是getchar ()。Getchar()“使用”缓冲输入“:在用户按下"Enter”之前,实际上不会得到任何输出。除非使用命令提示符(或类似命令),否则它并不真正适用。

旧的DOS方法是getch()和getche(),取自"conio.h“。这种方法在针对现代操作系统的现代C/C++库中是不存在的。

建议:

如果你想创建一个文本模式的UI (特别是在Linux上),看看ncurses:

  • http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/

如果您想(在Windows或Linux上)编写游戏程序,请查看SDL:

  • http://www.libsdl.org/

===附录===

我还是推荐你去图书馆。但这里有一个函数演示了Linux下的“原始键盘输入”(也称为“未煮熟的”或“非规范的”输入):

http://cboard.cprogramming.com/c-programming/63166-kbhit-linux.html

代码语言:javascript
运行
复制
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>

void changemode(int);
int  kbhit(void);

int 
main(int argc, char *argv[])
{
  int ch;
  changemode(1);
  while ( !kbhit() )
  {
    putchar('.');
  }

  ch = getchar();

  printf("\nGot %c\n", ch);

  changemode(0);
  return 0;
}

void 
changemode(int dir)
{
  static struct termios oldt, newt;

  if ( dir == 1 )
  {
    tcgetattr( STDIN_FILENO, &oldt);
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt);
  }
  else
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt);
}

int 
kbhit (void)
{
  struct timeval tv;
  fd_set rdfs;

  tv.tv_sec = 0;
  tv.tv_usec = 0;

  FD_ZERO(&rdfs);
  FD_SET (STDIN_FILENO, &rdfs);

  select(STDIN_FILENO+1, &rdfs, NULL, NULL, &tv);
  return FD_ISSET(STDIN_FILENO, &rdfs);

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11199513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档