所谓键盘监听,就是用户按下某个键时系统做出相应的处理,本章讲到的输入输出函数也是键盘监听函数的一种,例如 getchar()、getche()、getch() 等。下面的代码演示了 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. }

在 Windows 下的运行结果:
Number: 1  //按下任意键
Number: 2  //按下任意键
Number: 3  //按下任意键
Number: 4  //按下任意键
Number: 5  //按下Esc键退出

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

#include <stdio.h>
#include <conio.h>
int main(){
char ch;
int i = 0;
//按ESC终止输入
printf("%s","按ESC终止输入 \n");
while(ch = getch()){
if(ch == 27){
break;
}else{
printf("第%3d 次输入的字符是 %c\n", ++i,ch);
}
}
return 0;
}

阻塞式键盘监听用于用户输入时一般没有任何问题,用户输入完数据再执行后面的代码往往也符合逻辑。然而在很多小游戏中,阻塞式键盘监听会带来很大的麻烦,用户要不停按键游戏才能进行,这简直就是灾难,所以在小游戏中一般采用非阻塞式键盘监听:用户输入数据后程序可以捕获,用户不输入数据程序也可以继续执行。

在 Windows 系统中,conio.h头文件中的kbhit()函数就可以用来实现非阻塞式键盘监听。

conio.h 是 Windows 下特有的头文件,所以 kbhit() 也只适用于 Windows,不适用于 Linux 和 Mac OS。

用户每按下一个键,都会将对应的字符放到输入缓冲区中,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,是的话就退出循环,否则继续循环。

#include <stdio.h>
#include <conio.h>
#include <windows.h>
int main(){
char ch;
int i = 0;
//按ESC终止输入
printf("%s","按ESC终止输入 \n");
while(1){
if (kbhit()){
ch = getch();
if(ch == 27){
break;
}else{
printf("第%3d 次输入的字符是 %c\n", ++i,ch);
}
}
else
{
printf("%s","执行其他的功能。。。\n");
Sleep(10);
}
}
return 0;
}

C语言:监听键盘的更多相关文章

  1. java 事件监听 - 键盘

    java 事件监听 - 键盘 //事件监听 //键盘事件监听,写了一个小案例,按上下左右,改变圆形的位置,圆形可以移动 import java.awt.*; import javax.swing.*; ...

  2. Vue 监听键盘,键盘修饰符keyup

    附录:键盘Key Code对照表 代码: <!doctype html> <html lang="en"> <head> <meta ch ...

  3. 通过监听键盘,实现对UITextView的内容移动

    视图出现时,增加观察 - (void)viewWillAppear:(BOOL)animated { // 增加对键盘的监听 [[NSNotificationCenter defaultCenter] ...

  4. android监听键盘

    android中的带有输入功能的页面布局经常被弹出的键盘遮挡,一种处理方法是监听键盘的弹出,设置布局的padding或隐藏某些占位控件,使得输入框不被键盘遮挡.一种常用的方法是当Activity设置为 ...

  5. python pynput监听键盘

    """小白随笔,大佬勿喷""" #键盘输入 from pynput.keyboard import Key,Controller,Liste ...

  6. 第35天学习打卡(输入框 TextField监听 简易计算器,组合+内部类回顾复习 画笔 鼠标监听 窗口监听 键盘监听)

    1.输入框 TextField监听  package com.kuang.lesson02; ​ import java.awt.*; import java.awt.event.ActionEven ...

  7. Vue中监听 键盘事件及修饰符

    键盘事件: keyCode 实际值 48到57     0 - 9 65到90           a - z ( A-Z ) 112到135       F1 - F24 8            ...

  8. 前端页面,使用 dom 鼠标拖拽画一个矩形和监听键盘

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  9. iOS 键盘的监听 调整view的位置

    iOS在处理键盘的出现和消失时需要监听UIKeyboardWillChangeFrameNotifications/UIKeyboardDidHideNotifications - (void)vie ...

随机推荐

  1. es api

    GET content-split-*/_search { "query": { "bool" : { "must" : [ { " ...

  2. Jmeter- 笔记2 - Jmeter介绍

    性能测试工具:Jmeter 环境:Window,jdk1.8 Jmeter是Apache下的Java语言开发.运行Java语言的环境是jre(Java run env.).jdk是Java开发工具包, ...

  3. Java中如何将函数名作为参数传递

    采用lambda表达式: import java.util.function.Function; class Test { public static void main(String... args ...

  4. 201871030139-于泽浩 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告

    201871030139-于泽浩 实验三 结对项目-<D{0-1}KP 实例数据集算法实验平台>项目报告 项目 内容 课程班级博客链接 2018级卓越班 这个作业要求链接 软件工程结对项目 ...

  5. 物联网安全Wi-Fi漫游

    物联网安全Wi-Fi漫游 根据Statistica的最新报告,到2021年,全球正在使用的Wi-Fi连接设备的数量预计将增长到222亿.这种Wi-Fi的广泛使用不仅包括消费者的Wi-Fi使用,而且还包 ...

  6. TVM部署预定义模型

    TVM部署预定义模型 本文通过深度学习框架量化的模型加载到TVM中.预量化的模型导入是在TVM中提供的量化支持之一. 本文演示如何加载和运行由PyTorch,MXNet和TFLite量化的模型.加载后 ...

  7. python-selenium 引入包或者类的清晰写法

    #cording=gbk#一般最上面放系统自带的包或者类import os import time##第二层放第三方下载的包或者类from selenium import webdriverfrom ...

  8. Java设计模式:23种设计模式全面解析(超级详细)以及在源码中的应用

    从网络上找的设计模式, 很全面,只要把UML类图看懂了, 照着类图将代码实现是很容易的事情. 步骤: 先看懂类图, 然后将代码实现, 之后再看文字 http://c.biancheng.net/des ...

  9. python安装、卸载包的方法

    anaconda包管理器 conda命令[1] 环境管理 conda info -e # 查看当前已安装的环境 conda create -n py27 python=2.7 # 添加2.7版本的Py ...

  10. 海量数据Excel报表利器——EasyExcel(开场篇)

    EasyExcel 简介篇 互联网的精髓就是共享,可以共享技术.共享经验.共享情感.共享快乐~ 很多年前就有这个想法了,从事IT行业时间也不短了,应该把自己工作和业余所学习的东西记录并分享出来,和有缘 ...