监听键盘可以使用C语言的字符输入函数,例如 getchar、getch、getche 等,

使用getche函数监听键盘的例子:

  1. #include <stdio.h>
  2. #include <conio.h>
  3. int main(){
  4. char ch;
  5. int i = 0;
  6. //循环监听,直到按Esc键退出
  7. while(ch = getch()){
  8. if(ch == 27){
  9. break;
  10. }else{
  11. printf("Number: %d\n", ++i);
  12. }
  13. }
  14. return 0;
  15. }

运行结果:
Number: 1  //按下任意键
Number: 2  //按下任意键
Number: 3
Number: 4
Number: 5  //按下Esc键

这段代码虽然达到了监听键盘的目的,但是每次都必须按下一个键才能执行getch后面的代码,也就是说,getch后面的代码被阻塞了。

阻塞式键盘监听非常不方便,尤其是在游戏中,往往意味着用户要不停按键游戏才能进行,所以一般采用非阻塞式键盘监听。

使用de >conio.hde>头文件中的de >kbhitde>函数可以实现非阻塞式键盘监听。

我们每按下一个键,都会将对应的字符放到键盘缓冲区,kbhit 函数会检测缓冲区中是否有字符,如果有字符返回非0值,没有返回0。但是kbhit不会读取字符,字符仍然留在缓冲区。请看下面的例子:

  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <conio.h>
  4. int main(){
  5. char ch;
  6. int i = 0;
  7. //循环监听,直到按Esc键退出
  8. while(1){
  9. if(kbhit()){
  10. ch = getch();
  11. if(ch == 27){
  12. break;
  13. }
  14. }
  15. printf("Number: %d\n", ++i);
  16. Sleep(1000); //暂停1秒
  17. }
  18. return 0;
  19. }

运行结果:
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5  //按下Esc键

每次循环,kbhit 会检测用户是否按下某个键(也就是检测缓冲区中是否有字符),没有的话继续执行后面的语句,有的话就通过 getch 读取,并判断是否是 Esc,是的话就退出循环,否则继续循环。

kbhit 之所以能够实现非阻塞式监听是因为它只检测字符,而不要求输入字符。

来源:python脚本自动迁移

C语言非阻塞式键盘监听的更多相关文章

  1. 阻塞式和非阻塞式IO

    有很多人把阻塞认为是同步,把非阻塞认为是异步:个人认为这样是不准确的,当然从思想上可以这样类比,但方式是完全不同的,下面说说在JAVA里面阻塞IO和非阻塞IO的区别 在JDK1.4中引入了一个NIO的 ...

  2. Java基础——NIO(二)非阻塞式网络通信与NIO2新增类库

    一.NIO非阻塞式网络通信 1.阻塞与非阻塞的概念  传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read() 或 write() 时,该线程被阻塞,直到有一些数据被读取或写入,该线程在 ...

  3. 为什么IO多路复用需要采用非阻塞式IO

    近段时间开始学习<Unix网络编程>,代码实现了一个简单的IO多路复用+阻塞式的服务端,在学习了非阻塞式IO后,有一个疑问,即: 假如调用了select,并且关注了几个描述字,当关注的描述 ...

  4. 非阻塞式I/O

    套接字的默认状态是阻塞的.这就意味着当发出一个不能立即完成的套接字调用时,其进程将被投入睡眠,等待相应的操作完成.可能阻塞的套接字调用可分为以下4类 (1)输入操作,包括read,readv,recv ...

  5. 4.NIO的非阻塞式网络通信

    /*阻塞 和 非阻塞 是对于 网络通信而言的*/ /*原先IO通信在进行一些读写操作 或者 等待 客户机连接 这种,是阻塞的,必须要等到有数据被处理,当前线程才被释放*/ /*NIO 通信 是将这个阻 ...

  6. 基于NIO写的阻塞式和非阻塞式的客户端服务端

    由于功能太过简单,就不过多阐述了,直接上阻塞式代码: package com.lql.nio; import org.junit.Test; import java.io.IOException; i ...

  7. NIO 的非阻塞式网络通信

    1.阻塞与非阻塞   ①  传统的 IO 流都是阻塞式的.也就是说,当一个线程调用 read() 或 write()时, 该线程被阻塞,直到有一些数据被读取或写入,该线程在此期间不能执行其他任务. 因 ...

  8. 并发式IO的解决方案:多路非阻塞式IO、多路复用、异步IO

    在Linux应用编程中的并发式IO的三种解决方案是: (1) 多路非阻塞式IO (2) 多路复用 (3) 异步IO 以下代码将以操作鼠标和键盘为实例来演示. 1. 多路非阻塞式IO 多路非阻塞式IO访 ...

  9. js 获取当前焦点所在的元素、给元素和input控件添加键盘监听事件、添加页面级的键盘监听事件

    页面级的键盘监听事件 document.onkeydown = function (event) { var e = event || window.event || arguments.callee ...

随机推荐

  1. 跨域The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed.解决方案

    使用Ajax跨域请求资源,Nginx作为代理,出现:The 'Access-Control-Allow-Origin' header contains multiple values '*, *', ...

  2. [opencv]KAZE、AKAZE特征检测、匹配与对象查找

    AkAZE是KAZE的加速版 与SIFT,SUFR比较: 1.更加稳定 2.非线性尺度空间 3.AKAZE速度更加快 4.比较新的算法,只有Opencv新的版本才可以用 AKAZE局部匹配介绍 1.A ...

  3. MySQL数据操作与查询笔记 • 【第5章 MySQL 函数】

    全部章节   >>>> 本章目录 5.1 数学函数和控制流函数 5.1.1 数学函数 5.1.2 控制流函数 5.2 字符串函数 5.2.1 字符串函数介绍 5.2.2 字符串 ...

  4. Ubuntu18.04 + Windows10 双系统安装

    此处忽略Windows10安装!!! 准备 安装环境 OS:Windows10 CPU:Intel(R) Core(TM) i5-10600KF CPU @ 4.10GHz 4.10 GHz GPU: ...

  5. RSA非对称加密算法实现:Golang

    RSA是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院工作.RSA ...

  6. Ubuntu18.04升级内核后修改grub文件启动顺序

    采坑:之前线上的服务器内核是4.15.0,后面有的服务跑不起来,说是要升级内核,于是就升级了,然后改了/etc/default/grub的启动顺序,改错了就启动不起来了,哈哈.后面多次尝试还是改成功了 ...

  7. Selenium_使用switch_to.alert处理弹窗(14)

    与switch_to.window 和 switch_to.frame 相比,switch_to.alert的alert方法使用了@property 装饰器,所以在使用时alert被当成属性调用. 演 ...

  8. 有道翻译js加密参数分析

    平时在渗透测试过程中,遇到传输的数据被js加密的比较多,这里我以有道翻译为例,来分析一下它的加密参数 前言 这是有道翻译的界面,我们随便输入一个,抓包分析 我们发现返回了一段json的字符串,内容就是 ...

  9. 如何查看mysql的用户权限

    查询语句:select * from mysql.user where user='root'\G;user是用户名 <privileges>是一个用逗号分隔的你想要赋予的MySQL用户权 ...

  10. azure django bug

    azure web app service azure web app service无法部署dhango网站 本地服务器测试代码 实际azure测试 django service 没有部署选项,需要 ...