SendInput на C++ не учитывает Ctrl и Shift
Я пытаюсь отправить нажатие клавиши CTRL+SHIFT+END в элемент управления в приложении C++, написанном на Embarcadero. Я использую код ниже:
tagINPUT ip;
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0;
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
// Appui sur Ctrl
ip.ki.wVk = VK_CONTROL;
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT));
// Appui sur Shift
ip.ki.wVk = VK_SHIFT;
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT));
// Appui sur End
ip.ki.wVk = VK_END;
ip.ki.dwFlags = 0;
SendInput(1, &ip, sizeof(INPUT));
Application->ProcessMessages();
// Relacher End
ip.ki.wVk = VK_END;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
// Relacher Shift
ip.ki.wVk = VK_SHIFT;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
// Relacher Ctrl
ip.ki.wVk = VK_CONTROL;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
Тем не менее, похоже, что он работает, как если бы не было никаких действий с клавишами CTRL и SHIFT.
Что я скучаю?
2 ответа
Проблема в том, что ключ vk_End является расширенным ключом. Так что вы должны заявить об этом во флагах:
`eip.ki.dwFlags = 0;
ip.ki.wVk = VK_END;
ip.ki.dwFlags = 0;
ip.ki.dwFlags = ip.ki.dwFlags || 1;
SendInput(1, &ip, sizeof(INPUT));
Application->ProcessMessages();
// Relacher End
ip.ki.wVk = VK_END;
ip.ki.dwFlags = KEYEVENTF_KEYUP;
ip.ki.dwFlags = ip.ki.dwFlags || 1;
SendInput(1, &ip, sizeof(INPUT));`
Обратите внимание, что я использовал 1 для установки флага, поскольку я не знаю, есть ли у вас константа, определенная в вашем C++, но предположим, что где-то есть константа.
Просто добавьKEYEVENTF_EXTENDEDKEY
пометитьdwFlags
input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
К сожалению, Win32 не предоставляет никакого способа определить, расширен ли ключ. Здесь я просто использовал вектор
extended_keys << VK_INSERT;
extended_keys << VK_DELETE;
extended_keys << VK_HOME;
extended_keys << VK_END;
extended_keys << VK_PRIOR;
extended_keys << VK_NEXT;
extended_keys << VK_LEFT;
extended_keys << VK_UP;
extended_keys << VK_DOWN;
extended_keys << VK_RIGHT;
и проверил, есть ли он внутри списка, добавьте флаг