找出键盘上当前按下的键

 


一、问题的提出
  有的程序员希望能够识别所有键盘上按下的键,以便在应用程序中能够正确地处理它。特别希望知道的是用户是否按下了键 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 中都列出了键盘上所有这些键的虚拟键码。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
winkey+f : 不用再去移动鼠标点“开始→搜索→文件和文件夹”了,在任何状态下,只要一按winkey+f就会弹出搜索窗口。    winkey+r : 在我们的文章中,你经常会看到这样的操作提示:“点击‘开始→运行’,打开‘运行’对话框……”。其实,还有一个更简单的办法,就是按winkey + r!    alt + tab : 如果打开的窗口太多,这个组合就非常有用了,它可以在一个窗口中显示当前打开的所有窗口的名称和图标●,选中自己希望要打开的窗口,松开这个组合就可以了。而alt+tab+shift则可以反向显示当前打开的窗口。    winkey+e : 当你需要打开资源管理器找文件的时候,这个快捷会让你感觉非常“爽”!再也不用腾出一只手去摸鼠标了!       小提示: winkey指的是键盘上刻有windows徽标的●。winkey主要出现在104和107键盘中。104键盘又称win95键盘,这种键盘在原来101键盘的左右两边、ctrl和alt之间增加了两个windwos和一个属性关联。107键盘又称为win98键盘,比104多了睡眠、唤醒、开机等电源管理,这3个大部分位于键盘的右上方。 再补充点..... F1           显示当前程序或者windows的帮助内容。 F2           当你选中一个文件的话,这意味着“重命名” F3           当你在桌面上的时候是打开“查找:所有文件” 对话框 F10或ALT        激活当前程序的菜单栏 windows或CTRL+ESC   打开开始菜单 CTRL+ALT+DELETE     在win9x中打开关闭程序对话框 DELETE         删除被选择的选择项目,如果是文件,将被放入回收站 SHIFT+DELETE      删除被选择的选择项目,如果是文件,将被直接删除而不是 放入回收站 CTRL+N         新建一个新的文件 CTRL+O         打开“打开文件”对话框 CTRL+P         打开“打印”对话框 CTRL+S         保存当前操作的文件 CTRL+X         剪切被选择的项目到剪贴板 CTRL+INSERT 或 CTRL+C  复制被选择的项目到剪贴板 SHIFT+INSERT 或 CTRL+V 粘贴剪贴板中的内容到当前位置 ALT+BACKSPACE 或 CTRL+Z 撤销上一步的操作 ALT+SHIFT+BACKSPACE   重做上一步被撤销的操作 Windows+D: 最小化或恢复windows窗口 Windows+U: 打开“辅助工具管理器”  Windows+CTRL+M    重新将恢复上一项操作前窗口的大小和位置 Windows+E       打开资源管理器 Windows+F       打开“查找:所有文件”对话框 Windows+R       打开“运行”对话框 Windows+BREAK     打开“系统属性”对话框 Windows+CTRL+F    打开“查找:计算机”对话框 SHIFT+F10或鼠标右击   打开当前活动项目的快捷菜单 SHIFT          在放入CD的时候按下不放,可以跳过自动播放CD。在打开wo rd的时候按下不放,可以跳过自启动的宏   ALT+F4         关闭当前应用程序 ALT+SPACEBAR      打开程序最左上角的菜单 ALT+TAB         切换当前程序 ALT+ESC         切换当前程序 ALT+ENTER        将windows下运行的MSDOS窗口在窗口和全屏幕状态间切换 PRINT SCREEN      将当前屏幕以图象方式拷贝到剪贴板 ALT+PRINT SCREEN    将当前活动程序窗口以图象方式拷贝到剪贴板 CTRL+F4         关闭当前应用程序中的当前文本(如word中) CTRL+F6         切换到当前应用程序中的下一个文本(加shift 可以跳到前 一个窗口) 在IE中: ALT+RIGHT ARROW     显示前一页(前进) ALT+LEFT ARROW     显示后一页(后退) CTRL+TAB        在页面上的各框架中切换(加shift反向) F5           刷新 CTRL+F5         强行刷新

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值