使用GetKeyState()

时间:2011-06-13 14:36:07

标签: c++ winapi keypress

我希望在按下某个键时切换一个布尔事件。具体来说,是'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,则切换键”

5 个答案:

答案 0 :(得分:15)

根据我的理解,你需要做的事情:

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

最高位表示是否按下了键。最低值表示是否切换了键(例如,如果打开了大写锁定)。

答案 1 :(得分:6)

由于SHORT已签名,因此高位等于符号位。

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

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

此外,115是's'的ASCII码。我相信,您应该使用大写案例83来测试'S'键。

答案 2 :(得分:-1)

有时候您想使用组合键

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

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

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

GetKeyState() vs. GetAsyncKeyState() vs. 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;
        }
   }

答案 3 :(得分:-2)

我使用全局变量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; 

答案 4 :(得分:-7)

迟到了,但是高阶位是0x80000000而不是0x8000,改变它并且它将正常工作。

另一位 - 对任何东西都没用 - 就像按下LSHIFT时按下CAPS LOCK一样。