Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;按键时循环模拟按键_C++_Windows_Keyboard - Fatal编程技术网

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

C++ C++;按键时循环模拟按键,c++,windows,keyboard,C++,Windows,Keyboard,我试图得到一个小应用程序,将不断模拟起来(↑ 箭头键)同时按下另一个键,在我的情况下,右键CTRL 然而,我编写的代码每次按下只会向上发送一个,而当我按住右CTRL键时,它只会向上发送一个并停止 我想说,这个代码完全是从我在网上找到的文档中建立的,我以前从来没有用C++编写过任何东西,或者任何其他语言,所以任何建议都会对我有很大帮助。我最初尝试在CAPS LOCK处于活动状态时执行此操作,但我发现获取密钥状态(开/关)对我来说根本不起作用,无论我尝试了什么 int main() { // T

我试图得到一个小应用程序,将不断模拟起来(↑ 箭头键)同时按下另一个键,在我的情况下,右键CTRL

然而,我编写的代码每次按下只会向上发送一个,而当我按住右CTRL键时,它只会向上发送一个并停止

<>我想说,这个代码完全是从我在网上找到的文档中建立的,我以前从来没有用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;
}  
不返回关于键是向上还是向下的布尔值,而是一个
SHORT
(一个16位整数,通常字面上是
SHORT

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

那么这意味着什么呢?硬件中的“最重要位”是实现定义的(),但我们可以将所有内容都视为“最左边”位是重要的(1000对0001)

所以我们可以用一个

我写这封信是为了帮助你想象这一切:

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;

std::cout
GetAsyncKeyState
使用最高有效位表示键的当前状态:“如果函数成功,返回值指定自上次调用GetAsyncKeyState以来是否按下了键,以及键当前是向上还是向下。”@MilesBudnek:the“and”这是一个逻辑问题,我相信。因此,如果自上次调用后未按下该键,则无论该键的状态如何,该函数都将始终返回false。不,只是做了一个快速测试。在我按下该键后,它立即返回0x8001,然后返回0x8000,直到我释放它为止。@AndyG非常感谢您为我指明了正确的方向。实际上,我从一开始就要做我想做的事情,那就是使用切换状态。我将其替换为if(GetKeyState(VK_CAPITAL)==1)@MilesBudnek:非常感谢您的认真!我已经更新了帖子。我希望你觉得它更准确。