【问题标题】:Using GetKeyState()使用 GetKeyState()
【发布时间】:2011-09-13 23:35:35
【问题描述】:

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

【问题讨论】:

标签: c++ winapi keypress


【解决方案1】:

据我了解,您需要做的:

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

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

【讨论】:

  • 谢谢,我已经尝试过了,但是当我按下“s”时,我的事件仍然没有发生。该程序编译得很好。我正在使用 Win32 API,我还缺少什么吗?编译器显然可以识别函数...
  • 也许你想要GetAsyncKeyStateGetKeyState 必须被调用以响应键盘事件。
  • 字母键的虚拟键码对应大写字母的ASCII码。您甚至可以使用char 代替int,这使代码更具可读性。所以试试GetKeyState('S')
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

      有时您想使用组合键

      为了避免组合键(例如: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;
              }
         }
      

      【讨论】:

      • 这似乎与 OP 的问题无关。
      【解决方案5】:

      这个有点晚了,但是高位是 0x80000000 而不是 0x8000,改变这个就可以了。

      另一点 - 没有任何用处 - 它的作用就像你在按下 LSHIFT 时按下了 CAPS LOCK。

      【讨论】:

      • GetKeyState MSDN reference 中所述,返回值为SHORT(16 位),而不是32 位值(换句话说,0x80000000 无效)。
      猜你喜欢
      • 2023-04-02
      • 2012-02-19
      • 2014-08-21
      • 1970-01-01
      • 2013-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多