SendInput со строкой Unicode неправильно отправлен в приложение UWP в Windows 10

У меня есть приложение, которое использовалось для отправки строки Unicode (не нажатия клавиш) благодаря API SendInput в Windows XP и Windows 7. Я попробовал его в Windows 10 и заметил, что если целевое приложение — UWP (например, Edge, OneNote и т. д.. .), строка Unicode не всегда правильно обрабатывается. Например, если приложение вызывает SendInput со строкой «привет», то приложение показывает «привет», «он» или даже ничего. Спасибо за советы

Вот код, основанный на интеграции Qt:

  QString text;
  ...
  int i = 0;
  while (i < result.length())
  {
    ...
    // Check if some char needs to be filtered out or converted
    ...
    INPUT Input;
    Input.type = INPUT_KEYBOARD;
    Input.ki.time = 0;
    Input.ki.dwExtraInfo = 0;
    Input.ki.wVk = 0;
    Input.ki.wScan = text.mid(i, 1).utf16()[0];
    Input.ki.dwFlags = KEYEVENTF_UNICODE;

    SendInput(1, &Input, sizeof(INPUT));
    Input.ki.dwFlags |= KEYEVENTF_KEYUP;
    SendInput(1, &Input, sizeof(INPUT));
    i++;
  }

Строка Unicode отправляется символ за символом для фильтрации или преобразования любого символа, который не может быть отображен.


person Edgard Baudry    schedule 01.02.2019    source источник
comment
Привет, пожалуйста, опубликуйте код вашего приложения, с которым у вас возникли проблемы.   -  person frido    schedule 01.02.2019


Ответы (1)


Windows UWP не являются «обычными», они построены непосредственно поверх COM, поэтому функции user32, такие как sendinput, не будут работать должным образом.

Если вы хотите поддерживать связь между приложениями, ознакомьтесь с AppServices, а также образцы, предоставленные Стефаном Виком в его блоге.

person Xeorge Xeorge    schedule 01.02.2019
comment
Спасибо Xeorge. Цель здесь состоит в том, чтобы действовать как метод ввода. Я знаю, что лучшим способом было бы разработать модуль TSF, но он довольно сложен, и документации не так много. (даже блог @EricBrown кажется отключенным от сайта блога Microsoft). Более того, изолированное поведение приложения UWP применяется таким же образом к модулю TSF, который загружает приложение, поэтому в такой конфигурации сложно получить доступ к ресурсу в системе ниже. SendInput очень легко реализовать, поэтому я пытаюсь заставить его работать. - person Edgard Baudry; 04.02.2019