键盘检测程序

最近在看Neil Matthew和Rick Stones的Beginning Linux Programming, 在 terminals 学到了如何检测按键的方法.话不多说先上代码:

#include <unistd.h>
#include <stdlib.h>
#include <curses.h>#define LOCAL_ESC_KEY   27int main()
{initscr();cbreak();noecho();keypad(stdscr, TRUE);clear();mvprintw(5, 5, "Keypad  Detection demo. Press 'q' to quit");move(7, 5);refresh();int key = getch();while(key != ERR && key != 'q') {move(7, 5);clrtoeol();if( (key >= 'A' && key <= 'z') ||(key >= 'a' && key < 'z')) {printw("Key was %c", key);} else if( (key >= '0' && key <= '9') ) {printw("Key was %c", key);} else if( (key >= KEY_F0 && key <= KEY_F0+12) ) {printw("Key was F%d", key-KEY_F0);} else {switch(key) {case LOCAL_ESC_KEY: printw("Esc key");break;case KEY_END: printw("END key");break;case KEY_BEG: printw("BEGINNING key");break;case KEY_RIGHT: printw("RIGHT key");break;case KEY_LEFT: printw("LEFT key");break;case KEY_UP: printw("UP key");break;case KEY_DOWN: printw("DOWN key");break;// you may add more here...default: printw("Unmatched %d", key);break;}}           refresh();key = getch();}endwin();exit(0);
}

编译: gcc -o proc main.c -lcurses
这里使用了 curses,所以在编译的时候要加上-lcurses选项.
而所有的 curses 程序都少不了这两个函数
WINDOW *initscr(void);
成功则返回一个指向stdscr 的指针,否则返回 NULL 并打印报错信息到 stderr. initscr通常是 curses 程序的第一个函数,起到初始化 curses 的作用
int endwin(void);
成功返回 OK, 失败返回 ERR.
基本结构清楚后,这里介绍终端的两种输入模式:cooked modecbreak mode.
cook mode 下终端会将输入缓存, 程序只有在 ENTER 键按下后才能获得输入;而 cbreak mode 在按键按下的同时,程序即获得输入,也就是说前者有 buffer 缓冲而后者没有.程序正是使用cbreak mode的输入即得来检测按键.
当initscr成功返回时,程序即进入cooked mode, 这时调用cbreak后终端即进入cbreak mode,另外为了不让按键输入出现在屏幕上,程序调用noecho禁止回显.
为了获得键盘输入与功能按键(如方向键, F1等)的关系, 需要调用 keypad 函数
int keypad(WINDOW *win, bool bf);
这里第一个参数传入stdscr 指针即可.这样环境初始化就完成了,接下来就可以检测按键了, 有关按键的宏定义, 可以参见curses.h中的 KEY_ 开头的宏, 具体命令:
cat /usr/include/curses.h | grep “KEY_”
这里方便起见, 先贴出来:

#define KEY_CODE_YES    0400        /* A wchar_t contains a key code */
#define KEY_MIN     0401        /* Minimum curses key */
#define KEY_BREAK   0401        /* Break key (unreliable) */
#define KEY_SRESET  0530        /* Soft (partial) reset (unreliable) */
#define KEY_RESET   0531        /* Reset or hard reset (unreliable) */
#define KEY_DOWN    0402        /* down-arrow key */
#define KEY_UP      0403        /* up-arrow key */
#define KEY_LEFT    0404        /* left-arrow key */
#define KEY_RIGHT   0405        /* right-arrow key */
#define KEY_HOME    0406        /* home key */
#define KEY_BACKSPACE   0407        /* backspace key */
#define KEY_F0      0410        /* Function keys.  Space for 64 */
#define KEY_F(n)    (KEY_F0+(n))    /* Value of function key n */
#define KEY_DL      0510        /* delete-line key */
#define KEY_IL      0511        /* insert-line key */
#define KEY_DC      0512        /* delete-character key */
#define KEY_IC      0513        /* insert-character key */
#define KEY_EIC     0514        /* sent by rmir or smir in insert mode */
#define KEY_CLEAR   0515        /* clear-screen or erase key */
#define KEY_EOS     0516        /* clear-to-end-of-screen key */
#define KEY_EOL     0517        /* clear-to-end-of-line key */
#define KEY_SF      0520        /* scroll-forward key */
#define KEY_SR      0521        /* scroll-backward key */
#define KEY_NPAGE   0522        /* next-page key */
#define KEY_PPAGE   0523        /* previous-page key */
#define KEY_STAB    0524        /* set-tab key */
#define KEY_CTAB    0525        /* clear-tab key */
#define KEY_CATAB   0526        /* clear-all-tabs key */
#define KEY_ENTER   0527        /* enter/send key */
#define KEY_PRINT   0532        /* print key */
#define KEY_LL      0533        /* lower-left key (home down) */
#define KEY_A1      0534        /* upper left of keypad */
#define KEY_A3      0535        /* upper right of keypad */
#define KEY_B2      0536        /* center of keypad */
#define KEY_C1      0537        /* lower left of keypad */
#define KEY_C3      0540        /* lower right of keypad */
#define KEY_BTAB    0541        /* back-tab key */
#define KEY_BEG     0542        /* begin key */
#define KEY_CANCEL  0543        /* cancel key */
#define KEY_CLOSE   0544        /* close key */
#define KEY_COMMAND 0545        /* command key */
#define KEY_COPY    0546        /* copy key */
#define KEY_CREATE  0547        /* create key */
#define KEY_END     0550        /* end key */
#define KEY_EXIT    0551        /* exit key */
#define KEY_FIND    0552        /* find key */
#define KEY_HELP    0553        /* help key */
#define KEY_MARK    0554        /* mark key */
#define KEY_MESSAGE 0555        /* message key */
#define KEY_MOVE    0556        /* move key */
#define KEY_NEXT    0557        /* next key */
#define KEY_OPEN    0560        /* open key */
#define KEY_OPTIONS 0561        /* options key */
#define KEY_PREVIOUS    0562        /* previous key */
#define KEY_REDO    0563        /* redo key */
#define KEY_REFERENCE   0564        /* reference key */
#define KEY_REFRESH 0565        /* refresh key */
#define KEY_REPLACE 0566        /* replace key */
#define KEY_RESTART 0567        /* restart key */
#define KEY_RESUME  0570        /* resume key */
#define KEY_SAVE    0571        /* save key */
#define KEY_SBEG    0572        /* shifted begin key */
#define KEY_SCANCEL 0573        /* shifted cancel key */
#define KEY_SCOMMAND    0574        /* shifted command key */
#define KEY_SCOPY   0575        /* shifted copy key */
#define KEY_SCREATE 0576        /* shifted create key */
#define KEY_SDC     0577        /* shifted delete-character key */
#define KEY_SDL     0600        /* shifted delete-line key */
#define KEY_SELECT  0601        /* select key */
#define KEY_SEND    0602        /* shifted end key */
#define KEY_SEOL    0603        /* shifted clear-to-end-of-line key */
#define KEY_SEXIT   0604        /* shifted exit key */
#define KEY_SFIND   0605        /* shifted find key */
#define KEY_SHELP   0606        /* shifted help key */
#define KEY_SHOME   0607        /* shifted home key */
#define KEY_SIC     0610        /* shifted insert-character key */
#define KEY_SLEFT   0611        /* shifted left-arrow key */
#define KEY_SMESSAGE    0612        /* shifted message key */
#define KEY_SMOVE   0613        /* shifted move key */
#define KEY_SNEXT   0614        /* shifted next key */
#define KEY_SOPTIONS    0615        /* shifted options key */
#define KEY_SPREVIOUS   0616        /* shifted previous key */
#define KEY_SPRINT  0617        /* shifted print key */
#define KEY_SREDO   0620        /* shifted redo key */
#define KEY_SREPLACE    0621        /* shifted replace key */
#define KEY_SRIGHT  0622        /* shifted right-arrow key */
#define KEY_SRSUME  0623        /* shifted resume key */
#define KEY_SSAVE   0624        /* shifted save key */
#define KEY_SSUSPEND    0625        /* shifted suspend key */
#define KEY_SUNDO   0626        /* shifted undo key */
#define KEY_SUSPEND 0627        /* suspend key */
#define KEY_UNDO    0630        /* undo key */
#define KEY_MOUSE   0631        /* Mouse event has occurred */
#define KEY_RESIZE  0632        /* Terminal resize event */
#define KEY_EVENT   0633        /* We were interrupted by an event */
#define KEY_MAX     0777        /* Maximum key value is 0633 */

上面的程序只做了对于数字,字母,方向键, F n键以及 ESC 键检测.而根据这些宏, 你就可以完善上述程序.

参考


Beginning Linux® Programming 4th Edition, Neil Matthew && Richard Stones

Linux/ Unix 键盘检测程序相关推荐

  1. 基本BASH SHELL脚本命令——Linux系统管理命令-检测程序、检测磁盘空间

    详细介绍Linux系统管理命令,演示如何通过命令行命令来探查Linux系统的内部信息 一.监测程序 Linux系统管理员面临的最复杂的任务之一就是跟踪运行在系统中的程序--尤其是现在,图形化桌面集成了 ...

  2. STC51入门笔记(郭天祥C语言)---第四节:键盘检测原理及应用实现

    声明:本篇文章只是个人知识盲区.知识弱点.重点部分的归纳总结,望各位大佬不喜勿喷.梳理顺序是按照书籍的实际顺序梳理,转载请注明出处. 作者:sumjess 键盘分为编码键盘和非编码键盘.键盘上闭合键的 ...

  3. 三、键盘检测原理及应用实现

    键盘检测原理及应用实现 视频链接:[3-4] 独立按键控制LED移位_哔哩哔哩_bilibili 对应课程P7-P10 键盘实际上就是一组按键,在单片机的外围电路中,通常用到的按键都是机械弹性开关,当 ...

  4. linux 读取键盘上下左右键小程序

    linux 读取键盘上下左右键小程序 月城雪兔 2016-06-03 17:28:31 因为想读取键盘的上下左右方向键,却发现在网上不容易找到恰当的例子,最后是以一个ros程序简化而来的. 第一,为什 ...

  5. 【计算机原理与接口技术(UNIX)⑲ 完结篇】——可编程计数器 8254 [ 流光发生器、8254工作方式检测程序的设计]

    ✅ 通过对 [计算机与UNIX汇编原理 ① ~ ⑫]的学习,我们已经大致掌握了汇编程序设计的相关知识 接下来,我将其分栏名改为 [计算机原理与接口技术(UNIX) ],重点将放在 "计算机原 ...

  6. linux下怎么查看程序异常,如何检测、定位linux程序异常

    作为linux开发,在工作中或者面试的时候经常会遇到怎么检测程序异常的问题,下面对此作一个总结. 0. 查看程序日志.项目更新日志,发现可疑的地方 使用linux查看内存cpu指令,top.ps初步看 ...

  7. linux程序测试工具gprof,Linux系统-耗时检测-gprof操作入门

    Linux系统-耗时检测-gprof操作入门. 一定时间的输入的程序处理延时,现需测量程序中各个函数的耗时比例,找到性能瓶颈,使用gprof工具检测. 1. gprof的功能 gprof和oprofi ...

  8. linux查看键盘命令,linux下的键盘检测

    话说,仅仅是一个键盘检测就好麻烦.我还是懂的太少了... #include #include #include #include #include #include #include #include ...

  9. linux键盘检测软件,linux下的键盘检测

    话说,仅仅是一个键盘检测就好麻烦.我还是懂的太少了... #include #include #include #include #include #include #include #include ...

  10. linux/unix编程手册-61_64

    title: linux/unix编程手册-61_64 date: 2018-10-07 11:53:07 categories: programming tags: tips linux/unix编 ...

最新文章

  1. 独家 | XGBoost介绍:用监督学习来预测期望寿命
  2. windows 2003几个优化技巧
  3. CNN结构:Windows使用FasterRCNN-C++版本
  4. 修复迁移后Net Standard项目中的错误
  5. ssm(Spring+Spring mvc+mybatis)实体类——Dept
  6. 下载的oracle如何解压,深度概述Ubuntu oracle下载解压
  7. linux 系统vt 测试,vt-x linux子系统
  8. gson java 对象_Gson把json串转换成java实体对象
  9. Java 算法 旅行家的预算
  10. [渝粤教育] 西南科技大学 应用文写作 在线考试复习资料
  11. 《Python核心编程》18.多线程编程(二)
  12. 谈一下UI框架经常看到Vue的.sync修饰符
  13. xxl-job架构源码解析
  14. svn 创建分支,合并分支
  15. VARCHART XGantt与活动互动教程指南
  16. 解决win7任务栏谷歌浏览器chrome图标丢失、异常空白的问题
  17. vivado hls 笔记
  18. 通过计算机管理看主板型号,电脑主板型号在哪里看? 每日一答
  19. 纯CSS实现点击图片触发select下拉框使之展开
  20. 使用Selenium模拟登陆百度盘

热门文章

  1. 产品商业需求文档_【器】我的产品需求文档心法
  2. 《程序猿的搬砖生活》八、学生时代最后的“疯狂”
  3. Premiere Pro CS6自学所需的视频编辑基础(一)
  4. 【Codeforces 1009C】Annoying Present
  5. Android 版本API对应表
  6. 2020考研计算机(408)考试大纲
  7. python sub函数用法_Python Pandas dataframe.sub()用法及代码示例
  8. python爬取下厨房本周受欢迎菜谱
  9. 手把手教你运用JAVA爬虫技术爬取小说
  10. 数字化时代,如何做好用户体验与应用性能管理