Using GetKeyState()

Using GetKeyState()

本文关键字:GetKeyState Using      更新时间:2023-10-16

我希望在按键时有一个布尔事件切换。特别是,s的键。有人向我介绍了GetKeyState()函数,它应该在Win32 API下工作。我知道字母s的ASCII代码是115,所以我的代码如下:

if (GetKeyState(115) == 1)
{
<EVENT>
}

然而,这是行不通的。为什么?以下是MSDN参考资料:http://msdn.microsoft.com/en-us/library/ms646301%28v=vs.85%29.aspx。。。"如果低位为1,则切换键"

据我所知,您需要做的是:

if( GetKeyState(115) & 0x8000 )
{
    <EVENT>
}

如果按键被按下,最高位告诉。最低的告诉键是否被切换(比如,如果帽锁被打开)。

由于SHORT是有符号的,所以高阶位等于符号位。

因此,要测试是否按下了给定的键,只需测试GetKeyState()返回的值是否为负:

if (GetKeyState('S') < 0) {
    // The S key is down.
} else {
    // The S key is up.
}

此外,115是"s"的ASCII码。我认为,你应该使用大写83来测试"S"键。

我使用全局变量bool altgr

示例:

void Editor::HandleKey(char car) {
    bool shift = false;
    //bool altgr = false;
    bool printable = false;
    if (car == 27) SendMessage(hwnd, WM_DESTROY, 0, 0);
    if ((GetKeyState(VK_CAPITAL) & 0x0001) == 1) shift = true;
    if ((GetKeyState(VK_SHIFT) & 0x8000) == 0x8000) shift = true;
    // if(GetKeyState(VK_RMENU) & 0x80000000 == 0x80000000) altgr = true;
    if (car == 18) altgr = true; 

有时您想要使用键的组合

为了避免键组合(例如:VK_SHIFT和VK_LEFT)满足两个条件的情况:

std::cout << "Shift RIGHT pressed" << std::endl;
std::cout << "LEFT key pressed" << std::endl;

只需使用Sleep(...);GetAsyncKeyState(VK_...)

GetKeyState()与GetAsyncKeyState[()与getch()?

#include <windows.h>  
    ...
    while (1)
    {
        if ((GetKeyState(VK_SHIFT) & 0x8000) && (GetAsyncKeyState(VK_LEFT) & 0x8000))
        {
            Sleep(200);
            std::cout << "Shift LEFT pressed" << std::endl;
        }
        if ((GetKeyState(VK_SHIFT) & 0x8000) && (GetAsyncKeyState(VK_RIGHT) & 0x8000))
        {
            Sleep(200);
            std::cout << "Shift RIGHT pressed" << std::endl;
        }
        if (GetAsyncKeyState(VK_RIGHT))
        {
            std::cout << "RIGHT key pressed" << std::endl;
        }
        if (GetAsyncKeyState(VK_LEFT))
        {
            std::cout << "LEFT key pressed" << std::endl;
        }
   }

这有点晚,但高位是0x80000000,而不是0x8000,更改此项,它将正常工作。

另一点——毫无用处——它的作用就像你在按下LSHIFT时按下了CAPS LOCK。