Использование строки с функцией SendInput в Windows - PullRequest
0 голосов
/ 22 января 2020

Я хочу использовать std::string для функции SendInput().

После некоторых исследований я обнаружил, что VkKeyScanEx может помочь но код нуждается в дополнительных логах c для прописных или специальных символов. В последнем случае я понял, что могу смоделировать нажатие клавиши SHIFT , отправить ввод с клавиатуры в нижнем регистре, и тогда он будет отображаться в верхнем регистре. Тем не менее, существуют также «специальные» символы, такие как !"§$%&/()=?, для которых требуется удерживаемая клавиша SHIFT для корректного вывода. Кроме того, есть также умлауты, такие как äüö. Мой код ниже работает, но умляуты также пишутся с большой буквы, что, например, неправильно (потому что isalnum() также возвращает true для тех). Разве нет разумного способа обработки какого-либо строкового ввода и моделирования его с клавиатуры пользователя независимо от региона, языка и т. Д., Не вызывая такого логического беспорядка? Нет ли более простого и надежного способа сделать это?

const auto key_board_layout = GetKeyboardLayout(0);

void configure_input(INPUT& input)
{
    input.type = INPUT_KEYBOARD;
    input.ki.wScan = 0;
    input.ki.time = 0;
    input.ki.dwExtraInfo = 0;
    input.ki.dwFlags = 0;
}

void send_input(const HWND window_handle, const std::string& message)
{
    SetForegroundWindow(window_handle);
    std::locale::global(std::locale("")); // Needed to not crash on certain special characters      

    for (auto character : message)
    {
        INPUT key_input;
        configure_input(key_input);

        INPUT shift_input;
        configure_input(shift_input);
        shift_input.ki.wVk = VK_SHIFT;

        // Type the key
        const auto virtual_key = VkKeyScanEx(character, key_board_layout);
        key_input.ki.wVk = virtual_key;
        const auto is_shift_key_required = isupper(character) || !isalnum(character);
        if(is_shift_key_required)
        {
            // Hold down the shift key
            SendInput(1, &shift_input, sizeof(INPUT));
        }
        SendInput(1, &key_input, sizeof(INPUT));

        // Release the key
        key_input.ki.dwFlags = KEYEVENTF_KEYUP;
        SendInput(1, &key_input, sizeof(INPUT));

        if(is_shift_key_required)
        {
            // Release the shift key
            shift_input.ki.dwFlags = KEYEVENTF_KEYUP;
            SendInput(1, &shift_input, sizeof(INPUT));
        }
    }
}
...