GetAsyncKeyState键盘操作

目录

参数:

返回值:

    0x8000 : 

使用 GetAsyncKeyState 检测键盘状态:

示例:实时检测键盘输入

一键一动 :

注意事项:

总结:

GetAsyncKeyState 是一个 Windows API 函数,用于检测某个键的状态(是否被按下),并且可以返回该键的状态信息(按下或松开)。这个函数非常适合用于实时检测键盘输入,尤其在图形程序和游戏开发中。

函数原型:

SHORT GetAsyncKeyState(int vKey);

Async:表示“异步”。在编程中,异步通常意味着操作可以在不阻塞主线程的情况下进行。对于 GetAsyncKeyState,这意味着它可以在任何线程中调用,而不需要等待某个特定的事件或消息循环。

 KeyState:这部分直接描述了函数的功能,即获取键盘按键的状态。

因此,GetAsyncKeyState 的名称反映了其功能:异步地获取键盘按键的状态。

参数:

  • vKey:需要检测的虚拟键代码,表示特定的键。常见的键代码可以在 Windows 文档中找到,例如:
    • VK_LEFT:左方向键
    • VK_RIGHT:右方向键
    • VK_UP:上方向键
    • VK_DOWN:下方向键
    • VK_SPACE:空格键
    • VK_RETURN:回车键
    • VK_SHIFT:Shift 键
    • VK_CONTROL:Ctrl 键
    • VK_TAB:Tab 键
    • VK_LBUTTON:鼠标左键

返回值:

GetAsyncKeyState 返回一个 SHORT 类型的值。该返回值的低位和高位各自表示键的状态:

  • 低位(第 1 位)

    • 0:键未被按下。
    • 1:键已被按下。
  • 高位(第 15 位)

    • 0:键上次被释放。
    • 1:键仍然按下。
    0x8000 : 

           0x8000 就是一个常用的掩码,用于检测返回值的高位是否为 1。        

   0x8000 在二进制中表示为:

1000 0000 0000 0000

        这个值的二进制中,只有第 15 位(从右数)是 1,其他所有位都是 0。 

        当你调用 GetAsyncKeyState 函数时,它返回的 16 位值的低位和高位包含了按键的状态信息。如果你希望检查键是否被按下,并且想检查高位(即按键是否已经持续按下),你可以使用 0x8000 来与返回值进行按位与(&)操作。

        如何使用 0x8000

GetAsyncKeyState 返回一个 SHORT 类型的值,你可以使用 0x8000 来检查该值的高位是否为 1。通过按位与操作,可以提取返回值中的高位(第 15 位)。

例如,下面的代码检查某个键是否持续按下:

if (GetAsyncKeyState(VK_SPACE) & 0x8000) {
    // 空格键被持续按下
    printf("Space key is pressed\n");
}
  • GetAsyncKeyState(VK_SPACE) 返回的值包含了按键的状态。
  • & 0x8000 只保留高 1 位,用来检查该键是否仍然按下。

如果键被按下且高位为 1,GetAsyncKeyState 的返回值按位与 0x8000 后结果不为 0,条件判断成立,表示该键仍然按下。

示例:

如果 GetAsyncKeyState 返回值为:

  • 0x8001(二进制:1000 0000 0000 0001):
    • 高位为 1,表示键当前处于按下状态。
    • 低位为 1,表示键是按下的状态。
  • 0x0001(二进制:0000 0000 0000 0001):
    • 高位为 0,表示键之前已释放,当前并没有按下。
    • 低位为 1,表示键曾经被按下(但已松开)。

使用 GetAsyncKeyState 检测键盘状态:

  1. 检测按键是否按下: 你可以通过检查返回值的低位来判断某个键是否按下。

if (GetAsyncKeyState(VK_SPACE) & 0x8000) {
    // 空格键被按下
    printf("Space key is pressed\n");
}

      2.检测按键是否被松开: 如果你希望检测按键是否松开,可以检查返回值的高位。 

if ((GetAsyncKeyState(VK_SPACE) & 0x8000) == 0) {
    // 空格键已经松开
    printf("Space key is released\n");
}

示例:实时检测键盘输入

假设你想在图形程序或游戏中实时检测按键并执行相应操作:

#include <windows.h>
#include <stdio.h>

int main() {
    while (1) {
        if (GetAsyncKeyState(VK_UP) & 0x8000) {
            printf("Up arrow key is pressed\n");
        }
        if (GetAsyncKeyState(VK_DOWN) & 0x8000) {
            printf("Down arrow key is pressed\n");
        }
        if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
            printf("Left arrow key is pressed\n");
        }
        if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {
            printf("Right arrow key is pressed\n");
        }

        // 防止占用过多 CPU 资源
        Sleep(100);  // 延迟 100 毫秒
    }
    return 0;
}

一键一动 :

在使用 GetAsyncKeyState 时,如果不加控制,确实可能会出现按键被多次检测到的情况,因为 GetAsyncKeyState 会在按键按下的整个过程中返回一个非零值(包括按下的瞬间以及按住键时)。为了解决“一键一动”的问题,可以使用一个标志来记录按键是否已经被检测过,避免在按键被按住时多次触发。

以下是一个简单的实现思路,使用一个变量来确保每次按键被按下时只触发一次:

#include <iostream>
#include <windows.h>

int main() {
    bool keyPressed = false;  // 标记按键是否已经按下

    while (true) {
        // 检查某个键(比如空格键)是否被按下
        if (GetAsyncKeyState(VK_SPACE) & 0x8000) {  // 0x8000 表示按键被按下
            if (!keyPressed) {  // 如果还没有按下
                std::cout << "空格键被按下!" << std::endl;
                keyPressed = true;  // 设置为已按下
            }
        } else {
            keyPressed = false;  // 键释放时重置标志
        }

        // 可以加个小延迟,防止CPU占用过高
        Sleep(10);
    }

    return 0;
}
  1. GetAsyncKeyState(VK_SPACE) 检查空格键的状态。如果按键被按下,它返回非零值,其中 0x8000 表示按下。

  2. keyPressed 用来标记键是否已经被按下。初始时,keyPressedfalse

  3. 如果空格键被按下,并且 keyPressedfalse(表示之前没有按下过),则输出一条消息,并将 keyPressed 设置为 true,避免再次触发。

  4. 当空格键松开时,GetAsyncKeyState 返回 0,此时将 keyPressed 重置为 false,允许下一次按键触发。

     通过这种方式,可以确保每次按键只触发一次,而不会因为按住键不放而重复执行操作。

注意事项:

  1. GetAsyncKeyState 并不会等待按键事件: 该函数会立即返回当前键的状态,而不是阻塞程序直到键被按下或松开。因此,它非常适合用于实时键盘检测。

  2. 多次调用获取状态: 如果你想要检测某个键的状态变化(例如按下和松开事件),你通常需要每帧调用 GetAsyncKeyState,并且通过前后状态的比较来判断按键是否发生了变化。

  3. 键的重复检测GetAsyncKeyState 返回的是当前键的状态,而不是事件。如果你需要处理重复输入(例如持续按下某个键时重复触发操作),可以通过计算返回值的高位(是否持续按下)来判断。

  4. 对键盘的异步检测: 与 GetMessage()PeekMessage() 等消息机制不同,GetAsyncKeyState 直接返回键的当前状态,不依赖消息队列,因此它是“异步”的,适合实时检测。

总结:

GetAsyncKeyState 是一个非常有用的函数,可以在游戏开发、图形界面程序或其他需要实时检测键盘输入的程序中使用。它能够检测某个键的状态,并返回按键是否被按下或松开。通过合理的使用,可以实现实时输入检测,不会阻塞程序的运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值