一、问题的提出

有的程序员希望能够识别所有键盘上按下的键,以便在应用程序中能够正确地处理它。特别希望知道的是用户是否按下了键 SHIFT、CTRL、ALT、NUMLOCK 或 CAPSLOCK。对于键 SHIFT、CTRL 和 ALT,程 序员关心的用户是否当前按下此键;对于键 NUMLOCK 和 CAPSLOCK,程序员只关心用户是否在应用程序取得控制之前选取了此键。

二、解决方法

这是一个非常有趣的问题。如何在多任务、多窗口系统上确定键盘上哪个键是按下的,以使键盘状态对 所有应用程序来说都是一致的呢?由于有的键可能在另外的窗口中被按下,所以不能简单地捕捉键的按下操作。由于键 NUMLOCK 有可能在应用程序启动之前已被按下,所以也不能简单地监视此键被按下。

因此,要完成此任务所需要的是一个能够随时获取键盘状态的方法。幸运的是,Windows API 对此问题提供了一个简单的解决方案,即 API 函数 GetKeyboardState。

三、实现步骤

按照下列步骤实现一个例子程序。运行此例子程序,从菜单 Keyboard 中选择菜单项 Keys Pressed, 将弹出一个显示一系列键的对话框,每个键旁边没有文本。按下几个键并点击按钮 Show,则列表右边的状 态值将改变以反映这些键的当前状态。

实现例子程序的具体步骤如下:

1.在 Visual C++ 中,利用 AppWizard 创建新的项目文件,并命名此项目文件为 LD18.MAK.

2.进入 AppStudio 并创建新的对话框,在对话框中,添加五个文本域,标题分别为 Control Key、 Shift Key、Alt Key、Num Lock Key 和 Caps Lock Key。

3.与刚创建的五个文本域对齐,创建另外五个文本域。标题为空,ID 分别为:ID_CONTROL_KEY、 ID_SHIFT_KEY、ID_ALT_KEY、ID_NUM_LOCK_KEY 和 ID_CAPS_LOCK_KEY。

4.改变对话框的标题为 View Key States。

5.添加两个按钮,标题分别为 Show 和 Close,ID 分别为 ID_SHOW 和 IDOK。

6.进入 ClassWizard,选择按钮 Add Class。命名对话框类为 CKeyShowDlg。

7.在 ClassWizard 中,从下拉列表中选择 CKeyShowDlg ,从列表对象中选择按钮 ID_SHOW, 从消息列表中选择消息 COMMAND,点击按钮 Add Function,函数命名为 OnShow。

8.在对象 CKeyShowDlg 的方法 OnShow 中输入下列代码:

void CKeyShowDlg::OnShow()

{

unsigned char kbuf[256];

GetKeyboardState(kbuf);

if(kbuf[VK_CAPITAL]&1)

GetDlgItem(ID_CAPS_LOCK_KEY)->SetWindowText(“On”);

else

GetDlgItem(ID_CAPS_LOCK_KEY)->SetWindowText(“Off”);

if(kbuf[VK_SHIFT]&128)

GetDlgItem(ID_SHIFT_KEY)->SetWindowText(“On”);

else

GetDlgItem(ID_SHIFT_KEY)->SetWindowText(“Off”);

if(kbuf[VK_CONTROL]&128)

GetDlgItem(ID_CTRL_KEY)->SetWindowText(“On”);

else

GetDlgItem(ID_CTRL_KEY)->SetWindowText(“Off”);

if(kbuf[VK_MENU]&128)

GetDlgItem(ID_ALT_KEY)->SetWindowText(“On”);

else

GetDlgItem(ID_ALT_KEY)->SetWindowText(“Off”);

if(kbuf[VK_NUMLOCK]&1)

GetDlgItem(ID_NUM_LOCK_KEY)->SetWindowText(“On”);

else

GetDlgItem(ID_NUM_LOCK_KEY)->SetWindowText(“Off”);

}

9.进入 AppStudio,在菜单 IDR_MAINFAME 中,添加新的菜单 Keyboard。在菜单 Keybosrd 中, 添加菜单项 Keys Pressed,其 ID 为 ID_KEY_PRESSED。进入 ClassWizard,为对象 ID_KEY_PRESSED 和 消息 COMMAND 添加新的函数,命名此函数为 OnKeyPressed,并在此函数中添加下列代码:

void CMainFrame::OnKeyPressed()

{

CKeyShowDlg dlg;

dlg.DoModal();

}

10.在文件 MAINFRM.CPP 的顶部添加下列行:

#include “KeyShowDlg.h”

11.编译并运行此例子程序。

用法

Windows API 函数 GetKeyboardState 返回键盘上每一键的状态。对于可以按下和松开的键,如 SHIFT,CTRl,TAB 以及所有的字符键。键的”状态“或是高位设置(表示键被按下)或是高位清除(表 示键未被按下,即松开的)。对于切换选择的键,如 NUM LOCK 或 CAPS LOCK,低位设置表示此键当前 是选中(开)状态,低位清除表示此键当前是未选中(关)状态。

通过在预定时间检查键盘状态,可以随时得到被按下的任何键和所有键。例如:如果用户按下键 CTRL-ALT-SHIFT-F10,则在键盘缓冲区将设置下列键值的高位:

VK_SHIFT

VK_CONTROL

VK_MENU(为 ALT 键)

VK_F10

在线帮助或 include 文件 Windows.h 中都列出了键盘上所有这些键的虚拟键码。

c语言判断按下键盘,找出键盘上当前按下的键相关推荐

  1. 已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者。

    已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者. 答案: int max(int a,int b) { return (a+b+abs(a-b))/2; } ...

  2. C语言 输入一个5行5列的数组。1.求数组主对角线上元素的和。2.求出辅对角线上元素的积。3.找出主对角线上最大的值及其位置

    C语言 输入一个5行5列的数组.1.求数组主对角线上元素的和.2.求出辅对角线上元素的积.3.找出主对角线上最大的值及其位置 主对角线是什么: 在一个n阶方阵(或是n阶行列式)中,从左上角到右下角这一 ...

  3. c 怎么获取服务器文件是否存在,powershell - 需要找出服务器上是否存在特定的文件夹。如果是,那么哪个驱动器是C:或D - 堆栈内存溢出...

    我需要找出服务器上Backupeventlog存在名为Backupeventlog文件夹. 如果是,那么哪个驱动器为C:或D:驱动器. 此文件夹也为空,如果不为空,则此文件夹下创建的最新文件的日期是什 ...

  4. python批量删除微信好友_Python找出微信上删除你好友的人脚本写法

    原标题:Python找出微信上删除你好友的人脚本写法 相信大家在微信上一定被上面的这段话刷过屏,群发消息应该算是微信上流传最广的找到删除好友的方法了.但群发消息不仅仅会把通讯录里面所有的好友骚扰一遍, ...

  5. C语言:比较字符串,找出最大值

    题目概述:3个字符串找出最大值. 编程: #include<stdio.h> #include<string.h> int main() { char str[3][10]; ...

  6. linux下eclipse找不到插件位置,Linux 下安装Eclipse时所遇到的问题

    想在Linux下安装个eclipse来玩玩,昨天出现的问题,今天终于解决了,在此要感谢各位网友的帮助.现在我把我出现的问题在这说一下,希望也出现这个错误的朋友能得到帮助. 要在Linux下安装ecli ...

  7. tp5上一篇下一篇;php上一篇下一篇

    最终实现效果: 前提:文章有分类,权重,时间排序等 流程:因为这个功能不算难,本来想着是否能伸手主义一次,直接去网上拷贝一下直接用,奈何百度一下发现很多都是直接用的id为参照,比当前id小的即为上一篇 ...

  8. python线下培训-Python培训线上和线下有什么区别?

    大家想要学习Python的话,主要的方式主要是自学好参加培训,由于自学对自己的基础抗干扰能力要求比较大,好多小伙伴一般都会选择参加培训的方式来进行学习Python知识,而Python培训又包括线上和线 ...

  9. 计算机课程线下,计算机应用基础课程线上与线下混合教学优化方案

    黎荣振 摘 要 在计算机应用基础课程教学中应用线上与线下混合教学模式其不仅符合当代学生的需求,还有利于打破传统教学方式的弊端,弥补其存在的不足,扩大了学生获取知识的渠道,促进学生综合能力和综合素养的提 ...

  10. php点击事件下一页,点击上一页下一页信息没有更新

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 代码如下: $conn= mysql_connect("localhost","root", "duol ...

最新文章

  1. mybatis学习7 实战项目
  2. git 克隆远端分支,关联到本地,修改代码并提交到远程分支
  3. 【mac开发.NET】No installed provisioning profiles match the installed iOS signing identities
  4. ubuntu14.04 开启root登陆
  5. 为什么程序员更喜欢用google搜索? 因为正经!
  6. lambda 复制数组
  7. 安装eclipse的android adt 插件,eclipse安装ADT插件
  8. java 导出es数据_elasticseach 数据的导出与导出工具elasticdump使用
  9. Linux 命令(94)—— env 命令
  10. 计算机excel素材,excel操作练习题素材.doc
  11. 网站整站下载工具—HTTrack Website Copier
  12. ubuntu16.04使用360随身wifi2代
  13. 批量ping多个IP地址
  14. 阿里天池金融数据分析赛题2:保险反欺诈预测baseline
  15. RTX 3080和RTX 2080 Ti哪个好
  16. C# 处理PPT水印(二)——去除水印效果(文本水印、图片水印)
  17. 定时任务的corn表达式
  18. 如何在不同的窗口中打开多个Excel
  19. 吴思《潜规则》:错把任性当志气
  20. SQL Server附加数据库错误5123,另一个进程正在调用

热门文章

  1. 最大子列和问题(C语言)
  2. python 打开txt文件
  3. PPT修改母版页码(亲测可用)
  4. 马斯克 的 2500 吨 推力 的 大火箭 没什么 了不起
  5. java自动机字符串匹配_字符串匹配之有限自动机
  6. 使用nvim来代替VSCode,神操作
  7. 阿里一位 70 后程序员、架构师的 26 个职场感悟
  8. 滴答清单迅速入门【一知半解】
  9. 进出口流程 报关单据
  10. 公用计算机不使用键盘鼠标,鼠标键盘同时不能用了怎么回事_电脑的键盘和鼠标不能同时用如何解决...