c语言按键模式切换,二、Windows按键消息—键的先前状态、转换状态、位移状态...

键的先前状态

如果在此之前键是释放的,则键的先前状态为0,否则为1。对WM_KEYUP或者WM_SYSKEYUP消息,它总是设定为1;但是对WM_KEYDOWN或者WM_SYSKEYDOWN消息,此位可以为0,也可以为1。如果为1,则表示该键是自动重复功能所产生的第二个或者后续消息。

转换状态

如果键正被按下,则转换状态为0;如果键正被释放,则转换状态为1。对WM_KEYDOWN或者WM_SYSKEYDOWN消息,此字段为0;对WM_KEYUP或者WM_SYSKEYUP消息,此字段为1。

位移状态

在处理按键消息时,您可能需要知道是否按下了位移键(Shift、Ctrl和Alt)或开关键(Caps Lock、Num Lock和Scroll Lock)。通过呼叫GetKeyState函数,您就能获得此信息。例如:

iState = GetKeyState (VK_SHIFT) ;

如果按下了Shift,则iState值为负(即设定了最高位置位)。如果Caps Lock键打开,则从

iState = GetKeyState (VK_CAPITAL) ;

传回的值低位被设为1。此位与键盘上的小灯保持一致。

通常,您在使用GetKeyState时,会带有虚拟键码VK_SHIFT、VK_CONTROL和VK_MENU(在说明Alt键时呼叫)。使用GetKeyState时,您也可以用下面的标识符来确定按下的Shift、Ctrl或Alt键是左边的还是右边的:VK_LSHIFT、VK_RSHIFT、VK_LCONTROL、VK_RCONTROL、VK_LMENU、VK_RMENU。这些标识符只用于GetKeyState和GetAsyncKeyState(下面将详细说明)。

使用虚拟键码VK_LBUTTON、VK_RBUTTON和VK_MBUTTON,您也可以获得鼠标键的状态。不过,大多数需要监视鼠标键与按键相组合的Windows应用程序都使用其它方法来做到这一点-即在接收到鼠标消息时检查按键。实际上,位移状态信息包含在鼠标信息中,正如您在下一章中将看到的一样。

请注意GetKeyState的使用,它并非实时检查键盘状态,而只是检查直到目前为止正在处理的消息的键盘状态。多数情况下,这正符合您的要求。如果您需要确定使用者是否按下了Shift-Tab,请在处理Tab键的WM_KEYDOWN消息时呼叫GetKeyState,带有参数VK_SHIFT。如果GetKeyState传回的值为负,那么您就知道在按下Tab键之前按下了Shift键。并且,如果在您开始处理Tab键之前,已经释放了Shift键也没有关系。您知道,在按下Tab键的时候Shift键是按下的。

GetKeyState不会让您获得独立于普通键盘消息的键盘信息。例如,您或许想暂停窗口消息处理程序的处理,直到您按下F1功能键为止:

while (GetKeyState (VK_F1) >= 0) ; // WRONG !!!

不要这么做!这将让程序当死(除非在执行此叙述之前早就从消息队列中接收到了F1的WM_KEYDOWN)。如果您确实需要知道目前某键的状态,那么您可以使用GetAsyncKeyState。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的按键状态机的 C 语言代码示例: ```c #include <stdio.h> // 定义按键状态枚举类型 enum KeyState { KEY_UP, KEY_DOWN, KEY_PRESS, KEY_RELEASE }; // 定义按键状态机结构体 struct KeyStateMachine { enum KeyState currentState; enum KeyState lastState; }; // 初始化按键状态机 void initKeyStateMachine(struct KeyStateMachine *stateMachine) { stateMachine->currentState = KEY_UP; stateMachine->lastState = KEY_UP; } // 更新按键状态机 void updateKeyStateMachine(struct KeyStateMachine *stateMachine, int isKeyDown) { stateMachine->lastState = stateMachine->currentState; if (isKeyDown) { if (stateMachine->lastState == KEY_UP || stateMachine->lastState == KEY_RELEASE) { stateMachine->currentState = KEY_DOWN; } else if (stateMachine->lastState == KEY_DOWN || stateMachine->lastState == KEY_PRESS) { stateMachine->currentState = KEY_PRESS; } } else { if (stateMachine->lastState == KEY_UP || stateMachine->lastState == KEY_RELEASE) { stateMachine->currentState = KEY_UP; } else if (stateMachine->lastState == KEY_DOWN || stateMachine->lastState == KEY_PRESS) { stateMachine->currentState = KEY_RELEASE; } } } int main() { struct KeyStateMachine keyState; initKeyStateMachine(&keyState); // 模拟按键状态变化 updateKeyStateMachine(&keyState, 1); printf("Current state: %d\n", keyState.currentState); updateKeyStateMachine(&keyState, 1); printf("Current state: %d\n", keyState.currentState); updateKeyStateMachine(&keyState, 0); printf("Current state: %d\n", keyState.currentState); updateKeyStateMachine(&keyState, 0); printf("Current state: %d\n", keyState.currentState); return 0; } ``` 这个按键状态机可以处理按键的四种状态:弹起、按下、按住和释放。在 `updateKeyStateMachine` 函数中,根据当前状态和上一个状态以及按键是否按下,更新当前状态。在 `main` 函数中,我们模拟了按键状态的变化,并输出了当前状态

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值