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); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理