【问题标题】:C++ SendInput not letting go off the keyC++ SendInput 不放开键
【发布时间】:2013-12-30 07:39:05
【问题描述】:

我在下面使用这些代码,它们一直按住左右键,直到我自己按下这些键才松开。

我可以运行左键代码并一直按右键.. 它会一直按左键.. 直到我自己按左键才会停止。

当我运行右键代码时,右键也会发生同样的事情,它一直按右我可以按左键,它仍然会一直按右键,直到我自己按右键。

我使用 SendInput 的原因是因为 keybd_event 不可靠.. 如果你不在 DOWN/UP 之间放置 Sleep(Milliseconds) 它甚至不会做任何事情,并且使用 Sleep() 会抛出意图这个程序它必须尽可能快地点击它,按住键任何时间都可能导致错误的答案(这就像一个瞄准程序)

这个是用来敲右键的

INPUT ip[1];
ip[0].type = INPUT_KEYBOARD;
ip[0].ki.wScan = 0;
ip[0].ki.time = 0;
ip[0].ki.dwExtraInfo = 0;
ip[0].ki.wVk = VK_RIGHT; 
ip[0].ki.dwFlags = 0;

ip[1].type = INPUT_KEYBOARD;
ip[1].ki.wScan = 0;
ip[1].ki.time = 0;
ip[1].ki.dwExtraInfo = 0;
ip[1].ki.wVk = VK_RIGHT; 
ip[1].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(2, ip, sizeof(INPUT));

这个是用来敲左键的

INPUT ip[1];
ip[0].type = INPUT_KEYBOARD;
ip[0].ki.wScan = 0;
ip[0].ki.time = 0;
ip[0].ki.dwExtraInfo = 0;
ip[0].ki.wVk = VK_LEFT; 
ip[0].ki.dwFlags = 0;

ip[1].type = INPUT_KEYBOARD;
ip[1].ki.wScan = 0;
ip[1].ki.time = 0;
ip[1].ki.dwExtraInfo = 0;
ip[1].ki.wVk = VK_LEFT; 
ip[1].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(2, ip, sizeof(INPUT));

编辑:新代码看起来像这样,err 不喜欢这种风格。

INPUT ip[1] = {0};
ip[0].type = ip[1].type = INPUT_KEYBOARD;
ip[0].ki.wScan = ip[1].ki.wScan = 0;
ip[0].ki.time = ip[1].ki.time = 0;
ip[0].ki.dwExtraInfo = ip[1].ki.dwExtraInfo = 0;
ip[0].ki.wVk = ip[1].ki.wVk = VK_LEFT; 
ip[0].ki.dwFlags = 0;
ip[1].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(2, ip, sizeof(INPUT));

再次编辑:(也不起作用)我试图欺骗它先发送 KEYUP。

int intRetValue = -1;
INPUT ip[2] = {0};

ip[0].type = INPUT_KEYBOARD;
ip[0].ki.wScan = 0;
ip[0].ki.time = 0;
ip[0].ki.dwExtraInfo = GetMessageExtraInfo();
ip[0].ki.wVk = VK_RIGHT; 
ip[0].ki.dwFlags = KEYEVENTF_KEYUP;
ZeroMemory(&ip[1], sizeof(INPUT));
ip[1].type = INPUT_KEYBOARD;
ip[1].ki.wScan = 0;
ip[1].ki.time = 0;
ip[1].ki.dwExtraInfo = GetMessageExtraInfo();
ip[1].ki.wVk = VK_RIGHT; 
ip[1].ki.dwFlags = 0;
ZeroMemory(&ip[2], sizeof(INPUT));
ip[2].type = INPUT_KEYBOARD;
ip[2].ki.wScan = 0;
ip[2].ki.time = 0;
ip[2].ki.dwExtraInfo = GetMessageExtraInfo();
ip[2].ki.wVk = VK_RIGHT; 
ip[2].ki.dwFlags = KEYEVENTF_KEYUP;

intRetValue = SendInput(3, ip, sizeof(INPUT));
printf("retValue = %d\n", intRetValue);

【问题讨论】:

  • 您在写信给ip[1]时有未定义的行为。
  • 旁注:您可以通过将其设为 1 并将其归零、设置类型和 VK 代码、发送它、设置向上标志并发送它来节省编码空间。
  • @chris 我在想,如果我不将它们作为一个包裹发送,就会出现一些延迟/滞后,并且不会产生相同的效果。
  • @SSpoke,是的,这取决于您需要它有多强大,但即便如此,将它们归零并执行,例如,ip[0].type = ip[1].type = INPUT_KEYBOARD;。当然你还是得有一个足够大的数组。
  • @DanielKamilKozar 我该如何解决? INPUT ip = new INPUT[1]; 什么的?

标签: c++ sendinput


【解决方案1】:

想通了。

无法无延迟地使用 SendInput 链接。

彼此之间需要Sleep(Milliseconds);

INPUT ip = {0};
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0;
ip.ki.time = 0;
ip.ki.dwExtraInfo = GetMessageExtraInfo();
ip.ki.wVk = VK_RIGHT; 
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT));

Sleep(50); //Figure out the proper timing here

INPUT ip2 = {0};
ip2.type = INPUT_KEYBOARD;
ip2.ki.wScan = 0;
ip2.ki.time = 0;
ip2.ki.dwExtraInfo = GetMessageExtraInfo();
ip2.ki.wVk = VK_RIGHT; 
ip2.ki.dwFlags = 2;
SendInput(1, &ip2, sizeof(INPUT));

【讨论】:

  • 做什么?我必须在那里使用睡眠?
猜你喜欢
  • 2010-11-04
  • 2012-05-15
  • 2013-09-09
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多