关于c ++:使用GetKeyState()

Using GetKeyState()

我想在按下某个键时进行布尔事件切换。 具体来说,是" s"键。 我已经指出了GetKeyState()函数,该函数应该在Win32 API下工作。 我知道字母's'的ASCII码是115,所以我的代码如下:

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

但是,这不起作用。 为什么? 这是MSDN参考:http://msdn.microsoft.com/zh-cn/library/ms646301%28v=vs.85%29.aspx ..."如果低位为1,则切换键"


据我了解,您需要执行以下操作:

1
2
3
4
if( GetKeyState(115) & 0x8000 )
{
    <EVENT>
}

最高位指示是否按下了键。最下面的内容告诉您是否已切换键(例如,大写锁定是否已打开)。


由于SHORT是带符号的,因此高位等于符号位。

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

1
2
3
4
5
if (GetKeyState('S') < 0) {
    // The S key is down.
} else {
    // The S key is up.
}

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


有时您想使用组合键。

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

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

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

GetKeyState()vs.GetAsyncKeyState()vs.getch()?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#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;
        }
   }


我使用全局变量bool altgr

例:

1
2
3
4
5
6
7
8
9
10
11
12
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;

为此,位较晚,但高阶位为0x80000000而不是0x8000,更改此位将可以正常工作。

另一位-毫无用处-就像按LSHIFT时按了CAPS LOCK一样。