Я хочу использовать 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));
}
}
}