QQ登录

只需一步,快速开始

上位机MFC如何获得键盘虚拟键的状态

[ 复制链接 ]
::GetKeyboardState(KeyboardState);
可以获得键盘的全部状态。
具体哪一个键的状态,可以通过数组索引来获得。
比如KeyboardState[VK_SHIFT]

下面是百科对此函数的介绍。
应用程序可以调用该函数来检取所有虚拟键的当前状态。
当键盘消息被从该线程的消息队列中移去时,虚拟键的状态发生改变。
当键盘消息被发送到该线程的消息队列中,或者,当键盘消息被发送到其他线程的消息队列或被从其他线程的消息队列中检取到时,虚拟键的状态不发生改变。
(例外:通过AttachThreadlnput连接的线程共享同一键盘状态。)当函数返回时,由lpKeyState参数指向的每一个数组成员中都包含了一个虚拟键的状态数据。
若最高位被置为1,则该键处于down状态;否则,该键处于up状态。若最低位被置为1,则该键被触发。
当一个键被打开时称之为被触发,如capslock键。若最低位被置为0,该键被关闭且不被触发。
一个触发键也键盘上的指示灯(如果有的话)在该键被触发时点亮,在不被触发时灭掉。
若要检取单个虚拟键的状态信息,可以调用GetKeyState函数。
若要检取任一虚拟键的当前状态,而不管相应的键盘消息是否已从消息队列中检取到,可以使用GetAsyncKevState函数。
应用程序可以使用虚拟键码常数VK_SHIFT,VK_CONTROL和VK_MENU作为IpKeyState所指向的数组的下标。
这样给出的Shift,Ctrl,Alt键的状态不区分左右键。应用程序也可以使用如下的虚拟键码常数作为以上键的区分左右键的下标:
VK_LSHIFT,VK_RSHIFT,VK_LCONTROL,VK_RCONTROL;VK_LMENU,VK_RMENU仅当应用程序调用GetKeyboardState;
SetKeyboardState,GetAsyncKeyState,GetKeyState和MapVirtualKey函数时,才可用这些区分左右键的常数。


所以我们可以添加两个按钮控件,来调用下面的代码,查看结果。

  1. void CDemoDlg::OnTest1()
  2. {
  3.         BYTE KeyboardState[256];

  4.         //获得SHIFT键状态
  5.         ::GetKeyboardState(KeyboardState);

  6.         CString strText = _T("");

  7.         if (KeyboardState[VK_SHIFT] & 0x80)
  8.         {
  9.                 strText = _T("SHIFT键被按下。");
  10.         }
  11.         else
  12.         {
  13.                 strText = _T("SHIFT键被释放。");
  14.         }

  15.         AfxMessageBox(strText);
  16. }

  17. void CDemoDlg::OnTest2()
  18. {
  19.         CString strText = _T("");

  20.         BYTE KeyboardState[256];

  21.         //获得CAPITAL LOCK键状态
  22.         ::GetKeyboardState(KeyboardState);

  23.         if (KeyboardState[VK_CAPITAL] & 0x01)
  24.         {
  25.                 strText = _T("CAPITA LOCK键被触发。");
  26.         }
  27.         else
  28.         {
  29.                 strText = _T("CAPITA LOCK键未被触发。");
  30.         }

  31.         AfxMessageBox(strText);
  32. }
复制代码




回复

使用道具 举报

快速回复 返回列表 客服中心 搜索