GetKeyboardState返回所有虚拟键状态

该函数一般用来检测 CapsLock 或 NumLock 是否开启

带状态的键

像cape lock键这样带状态的键 

复制代码
void CGetKeyboardStateDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码

    UINT_PTR ID = SetTimer(1, 500, NULL);//创建一个定时器


}


void CGetKeyboardStateDlg::OnTimer(UINT_PTR nIDEvent)
{
    
    CString str;
    BYTE lpKeyState[256];
    //注意:虚拟键吗的十进制位置对应着相应的状态
    //比如VK_CAPITAL=0x14=20    通过lpKeyState[20]可以读取大小写状态

    BOOL b = GetKeyboardState(lpKeyState);//获取所有虚拟键状态
    /*
    参数1:BYTE lpKeyState[256]   指向一个256字节的数组,数组用于接收每个虚拟键的状态
    返回值:若函数调用成功,则返回非0值。若函数调用不成功,则返回值为0

    当函数返回时,由lpKeyState参数指向的每一个数组成员中都包含了一个虚拟键的状态数据。
    若最高位被置为1,则该键处于down状态;否则,该键处于up状态。
    若最低位被置为1,则该键被触发。    当一个键被打开时称之为被触发,如capslock键。
    若最低位被置为0,该键被关闭且不被触发。
    一个触发键也键盘上的指示灯(如果有的话)在该键被触发时点亮,在不被触发时灭掉。

    若要检取单个虚拟键的状态信息,可以调用GetKeyState函数。
    若要检取任一虚拟键的当前状态,而不管相应的键盘消息是否已从消息队列中检取到,可以使用GetAsyncKevState函数

    */

    BYTE byte = lpKeyState[20];//获取cape lock状态
    /*
    说明:像cape lock这样带状态的键,存在4个返回值:0,1,128,129
    因为高位和低位都有用
    
    */
    
    if (byte==1 || byte ==129) {
        str.Format(_T("处于大写状态byte=%d\r\n"), byte);
        ::OutputDebugString(str);
    }
    if (byte == 0 || byte == 128) {
        str.Format(_T("处于小写状态byte=%d\r\n"), byte);
        ::OutputDebugString(str);
    }
    


    CDialogEx::OnTimer(nIDEvent);
}
复制代码

 

普通键 

通过最高位判断就行

复制代码
void CGetKeyboardStateDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码

    UINT_PTR ID = SetTimer(1, 500, NULL);//创建一个定时器


}


void CGetKeyboardStateDlg::OnTimer(UINT_PTR nIDEvent)
{
    
    CString str;
    BYTE lpKeyState[256];
    
    BOOL b = GetKeyboardState(lpKeyState);//获取所有虚拟键状态
    

    BYTE byte = lpKeyState[65];//获取A键状态
    
    
    if (byte==128 || byte ==129) {
        str.Format(_T("A键按下byte=%d\r\n"), byte);
        ::OutputDebugString(str);
    }
    if (byte == 0 || byte == 1) {
        str.Format(_T("A键释放byte=%d\r\n"), byte);
        ::OutputDebugString(str);
    }
    

    


    CDialogEx::OnTimer(nIDEvent);
}
复制代码

 

【我的问题:普通键   低位为何也有 0和1   两个值  ??     知道请评论区留言,万分感谢】

 

组合键

复制代码
void CGetKeyboardStateDlg::OnBnClickedButton1()
{
    // TODO: 在此添加控件通知处理程序代码

    UINT_PTR ID = SetTimer(1, 500, NULL);//创建一个定时器


}


void CGetKeyboardStateDlg::OnTimer(UINT_PTR nIDEvent)
{
    
    CString str;
    BYTE lpKeyState[256];
    
    BOOL b = GetKeyboardState(lpKeyState);//获取所有虚拟键状态
    

    BYTE byte = lpKeyState[66];//获取B键状态
    BYTE byte1 = lpKeyState[17];//获取CTRL键状态

    BYTE byte2 = byte & byte1; //两键同时按下时高位才为1

    BYTE byte3 = byte2 & 128;  //两键同时按下时返回值才不为0
    

    if (byte3 != 0) {
        str.Format(_T("CTRL和B键同时按下了 byte3=%d\r\n"), byte3);
        ::OutputDebugString(str);
    }
    else {
        str.Format(_T("CTRL和B键没有同时按下   byte3=%d\r\n"), byte3);
        ::OutputDebugString(str);
    }

    
    CDialogEx::OnTimer(nIDEvent);
}
复制代码

 

 

 

 

 

 

 

posted @   天子骄龙  阅读(356)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示

目录导航