C++SendInput没有按键

C++ SendInput not letting go off the key

本文关键字:C++SendInput      更新时间:2023-10-16

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

我可以运行左键代码,然后继续按右键。。它会一直按左键。。只有我自己按左键,它才会停止

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

我使用SendInput的原因是keybd_event不可靠。。如果你不在向下/向上之间设置睡眠(毫秒),它甚至不会做任何事情,并且使用睡眠()会抛出这个程序的意图,它必须尽快点击它,长时间按住键可能会导致错误的答案(这就像一个瞄准程序)

这个是用来敲击右键的

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));

编辑:新代码看起来是这样的,呃,不喜欢这种风格。

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 = %dn", intRetValue);

想明白了。

无法使用链接且无延迟的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));