按下键时C ++循环模拟按键

时间:2016-11-28 19:03:19

标签: c++ windows keyboard

我正在尝试获取一个小应用程序,它将持续模拟 UP (↑箭头键),同时按下另一个键,在我的情况下右CTRL

我编写的代码只会为每次按下发送一个 UP - 当我按下右CTRL 时,它只会发送一个 UP < / kbd>并停止。

我想提一下,这段代码完全是基于我在网上找到的文档构建的,我从来没有用C ++编写任何东西,或者任何其他语言,所以任何建议都会对我有很大帮助。我最初尝试在 CAPS LOCK 处于活动状态时这样做,但我发现获得关键状态(开/关)根本不适用于我,无论我尝试了什么。

int main()
{
  // This structure will be used to create the keyboard
  // input event.
  INPUT ip;

  // Pause for 1 seconds.
  Sleep(1000);

  // Set up a generic keyboard event.
  ip.type = INPUT_KEYBOARD;
  ip.ki.wScan = 0; // hardware scan code for key
  ip.ki.time = 0;
  ip.ki.dwExtraInfo = 0;

  while(1){
      if(GetAsyncKeyState(VK_RCONTROL))
      {
            // Press the "UP arrow" key
            ip.ki.wVk = 0x26; // virtual-key code for the "UP arrow" key
            ip.ki.dwFlags = 0; // 0 for key press
            SendInput(1, &ip, sizeof(INPUT));

            Sleep(50);

            // Release the "UP arrow" key
            ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
            SendInput(1, &ip, sizeof(INPUT));

            Sleep(50);
      }
  }

  // Exit normally
  return 0;
}  

1 个答案:

答案 0 :(得分:1)

GetAsyncKeyState不会返回关于键是向上还是向下的布尔值,而是返回SHORT(16位整数,通常字面为short

  

如果函数成功,则返回值指定自上次调用GetAsyncKeyState以来是否按下了键,以及该键当前是向上还是向下。如果设置了最高有效位,则键为关闭,如果设置了最低有效位,则在上一次调用GetAsyncKeyState后按下该键。

那是什么意思? &#34;最重要的位&#34;在硬件中是实现定义的(Which end of a bit field is the most significant bit?),但我们可以将所有内容都视为最左边的&#34;位是显着的(1000对0001)。

因此我们可以使用bitmask来测试keydown。

我写了a small demo program来帮助您想象这一切:

std::cout << "number of bytes in a short: " << sizeof(short) << std::endl;
short i = 0;
i = 1 << (sizeof(short)*8-1); // use bit shifting to set most significant bit
std::cout << "Initial value of i: " << i << std::endl;
std::cout << "Initial value of i as hex: " << std::hex << i << std::endl;
std::cout << "Is most significant bit set?\n";
short bitmask = 0x8000;
std::cout << std::boolalpha << ((bitmask & i) != 0) << std::endl;
std::cout << "Unsetting MSB\n";
i = 0x0000;
std::cout << "Is most significant bit set?\n";
std::cout << std::boolalpha << ((bitmask & i) != 0) << std::endl;

此演示展示了如何将一个位掩码应用于short以询问是否设置了最高位。

GetAsyncKeyState为您提供了检查自上次检查后是否按下了键的附加功能。如需更简单的通话,请查看GetKeyState