有没有办法检测是否按下了某个键?

2023-11-29

我正在 Windows 计算机上的 cygwin 中编译并执行我的程序。我对 C 非常缺乏经验,但我想要一种方法来检测是否按下了某个键而不提示用户(例如我)。我的具有所需功能的伪代码如下所示。

char ch;
while(1){
    if(KeyBeenPressed()){
    //a key has been pressed before getting here
        ch=getKeyPressed();
        if(ch=='0'){
            printf("you have pressed 0");
        }
        else{
            printf("you did't press key 0");
        }
    }

//do other stuff
} 

我自己在网上搜索后尝试解决这个问题如下所示。

#include <stdio.h>
#include <conio.h>
char ch;
void main(){
    while(1){
        if(kbhit()){ //kbhit is 1 if a key has been pressed
            ch=getch();
            printf("pressed key was: %c", ch);
        }
    }
}

这段代码的一个问题是找不到 conio.h 文件(而且我还没有找到任何其他方法来解决这个问题)。显然 gcc 编译器无法处理 conio.h(我已附上它的链接)。http://www.programmingsimplified.com/c/conio.h

所以我想知道你们中是否有人知道一种方法来检测 C 中是否按下了某个键,我还想最好以字符形式检索按下的键(我计划在此应用程序中使用 0-9)。重要的是程序不能等到按下某个键。

我感谢任何可以解决此问题的建议! 此致 亨里克


我使用以下函数kbhit()。它在 Ubuntu 中的 g++ 编译器上运行良好。

#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
int kbhit(void)
{
  struct termios oldt, newt;
  int ch;
  int oldf;

  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

  ch = getchar();

  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);

  if(ch != EOF)
  {
    ungetc(ch, stdin);
    return 1;
  }

  return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法检测是否按下了某个键? 的相关文章

随机推荐

  • C# - WCF - 进程间通信

    用于进程间通信的最佳 WCF 绑定是什么 我已经在本地网络上使用了 WCF 它非常棒 我也想将它用于进程间通信 然而 我不想暴露网络上的通信 Use the 网络命名管道绑定用于同一台机器上的进程间通信 使用NetTcp绑定如果您跨越机器边
  • glutTimerFunc 问题

    我正在使用计时器函数来制作动画 但是当我将其放置在 Renderer 类中时遇到问题 void Renderer animate int value glutTimerFunc TIMERMSECS animate 0 错误 rendere
  • 如何在块循环中使用 PHPExcel 库确定文件结尾?

    使用 PHPExcel 库 我尝试迭代大约 1500 行 每行大约有 25 列 我正在使用这段代码 取自PHPExcel 运行内存为 256 512 和 1024MB Create a new Reader of the type defi
  • Eclipse:以编程方式创建首选项页面

    我正在尝试以编程方式创建首选项页面 我需要使用首选项页面而不在plugin xml 中定义首选项页面扩展点 我非常接近解决方案 我能够加载页面并在应用程序第一次加载时保存值 我的代码的核心是 PreferenceManager pmngr
  • 使用 VBA 创建具有不同计数的数据透视表

    我正在尝试使用 Excel 2013 VBA 创建一个数据透视表 并将 DISTINCT COUNT 作为值字段 我知道 如果您手动创建数据透视表 则必须选中 将此数据添加到数据模型 复选框 以便为值数据透视字段提供不同的计数选项 但我不知
  • Laravel 5.8:Homestead 重启后尚未设置门面根

    所以我正在尝试进入 Laravel 这是我第一次使用 Vagrant 所以这是我的问题 我已经通过Laravel 家园介绍并设置我的开发框 一切似乎都正常工作 我确实看到了 Laravel 默认应用程序 当结束这一天时 我已经停止了本地流浪
  • 仅初始化部分功能一次

    我有一个很小的函数 我想初始化一次 例如 void SomeFunc static bool DoInit true if DoInit CallSomeInitCode DoInit false The rest of the funct
  • 无法更改模型生成器选项

    我试图让 symfony 使用一个名为的自定义类jsDoctrineRecord代替sfDoctrineRecord对于它的模型 这是重写类的代码
  • C# 中调整系统图标大小

    我想用SystemIcons Warning但它对于我的需要来说太大了 我想调整它的大小 我努力了 Icon sizedIcon new Icon SystemIcons Warning new Size 10 10 但它不起作用 图标保持
  • 将图像 src 数据:转换为 Uint8Array

    我想使用 异食癖图书馆 用于调整图像大小 但它要求我提供一个 Uint8Array 并且我只有一个带有 src data image jpeg base64 9j 4AAQ 我不知道如何将其变成 Uint8Array 有什么想法吗 Than
  • 防止将 master 中的文件与 Git 合并

    In 另一个问题建议使用 gitattributes为了保持文件跟踪但不合并到不同的分支中 但我下面的用例似乎不起作用 mkdir git cd git git init echo B gt b txt git add b txt git
  • HTML5:其他标签内有效标签的参考

    不久前我正在使用w3c 验证器对于 HTML5 我正在尝试用一个标签来替换已弃用的
  • Python pandas - 在groupby之后过滤行

    例如 我有下表 index A B 0 0 0 1 0 8 2 0 8 3 1 5 4 1 3 分组后按A 0 index A B 0 0 0 1 0 8 2 0 8 1 index A B 3 1 5 4 1 3 我需要的是从每个组中删除
  • 在 x64 中调用绝对地址

    我无法弄清楚这一点 我可以做出这样的指令 它工作没问题 call ffffdd80d60e4000 但我该如何将其转换为字节呢 我查看了内存中的指令并显示了奇怪的东西 例如 0xe8 0x00 0x40 0x0e 0xd6 我唯一能识别的是
  • 如何正确地为数据结构中的图像设置动画而不出现 ConcurrentModificationException

    对于那些讨厌阅读长问题的人 获取下面的完整代码 运行它 点击SPACE几次 你会得到一个ConcurrentModificationException 简单的问题 你如何解决它 问题是试图删除一个Fireball当它退出屏幕时从列表中删除
  • 在 MySQL 监视器中阅读 MySQL 手册?

    Problem 有效阅读MySQL手册 Error mysql gt create database plastronics gt ERROR 1007 HY000 Can t create database plastronics dat
  • 如何对比两组变量(在 SAS 中)

    数据如下 ID X1 X2 X3 Z1 Z2 Z3 对于每个 ID 考虑两组变量 X1 X2 X3 and Z1 Z2 Z3 that X和Z的数量可以相同或不同 它们也可能有缺失值 每组中的变量值都是唯一的 也就是说 对于每个ID X1不
  • JSONObject.append 到对象中 - 结果是嵌套数组?

    以下代码生成一个嵌套数组作为包含三个项目的键的结果 import org codehaus jettison json JSONObject JSONObject ret new JSONObject for Key key keys re
  • 类和私有变量

    class Test1 def init self self test 1 def getvalue self return self test class Test2 Test1 def init self Test1 init self
  • 有没有办法检测是否按下了某个键?

    我正在 Windows 计算机上的 cygwin 中编译并执行我的程序 我对 C 非常缺乏经验 但我想要一种方法来检测是否按下了某个键而不提示用户 例如我 我的具有所需功能的伪代码如下所示 char ch while 1 if KeyBee