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;

и проверил, есть ли он внутри списка, добавьте флаг

Другие вопросы по тегам