C ++ SendInput не отпускает ключ

0

Я использую эти коды ниже, они держат левую и правую клавиши и никогда не отпускают их, пока я не нажму эти клавиши самостоятельно.

Я мог бы запустить левый код клавиши и продолжать нажимать правую клавишу.. и он будет продолжать нажимать левую клавишу. Только до тех пор, пока я не нажму на левую клавишу, я не остановлюсь.

То же самое происходит для правой клавиши, когда я запускаю правильный код клавиши, который он продолжает нажимать, я мог нажать левую клавишу, и он все равно будет продолжать нажимать правую клавишу, пока я не нажму на правую клавишу самостоятельно.

Причина, по которой я использовал SendInput, - это потому, что keybd_event ненадежен. Если вы не ставите Сон (миллисекунды) между DOWN/UP, он даже ничего не сделает, а использование 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);
  • 1
    У вас неопределенное поведение при записи в ip[1] .
  • 0
    Примечание: вы можете сэкономить место для кода, сделав единицу и обнулив его, установив тип и код VK, отправив его, установив флаг up и отправив его.
Показать ещё 8 комментариев
Теги:
sendinput

1 ответ

0
Лучший ответ

Догадаться.

Невозможно использовать 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));
  • 1
    Конечно, вы делаете.
  • 0
    Что делать? Я должен использовать там сон?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню