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是带符号的,因此高位等于符号位。
因此,要测试是否按下了给定的键,只需测试
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; |
只需使用
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
例:
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一样。