VkKeyScanEx / Sendinput альтернатива для Unicode? - PullRequest
1 голос
/ 11 января 2012

Я сейчас пытаюсь отправить персонажа.Поэтому я использую нативные методы GetKeyboardLayout и VkKeyScanExW, расположенные в user32.dll, чтобы получить код виртуальной клавиши (и состояние shift и control) для текущей раскладки клавиатуры из системы.После этого я отправляю этот виртуальный код ключа в приложение, используя собственный метод SendInput из user32.dll.

Все работает нормально, кроме знака евро.Когда я передаю этот символ в качестве параметра в VkKeyScanExW, он возвращает -1, что означает, что он не найден.На моей клавиатуре он расположен с помощью Ctrl + Menu + E (немецкая раскладка)

Теперь я предполагаю, что это происходит потому, что знак евро является знаком Unicode и не отображается в макете ascii.Я прочитал Sendinput также позволяет Unicode-режиме с использованием аппаратного скан-кода.Поэтому я надеюсь, что использование режима Юникода SendInput решит мои проблемы.Но я думаю, что мой код виртуальной клавиши - это не код аппаратного сканирования, поскольку диапазон Юникода шире.Где я могу найти пример того, как отправить символ Unicode (например, €) через SendInput в другой элемент управления / окно.MSDN и pinvoke.net не предоставляют полезных образцов.

1 Ответ

2 голосов
/ 12 января 2012

Тем временем я решил проблему, используя параметр unicode в SendInput.Теперь мне больше не нужно использовать VkKeyScan - я могу передать сам символ.

private static void SendUnicodeChar(char input)
{
    var inputStruct = new NativeWinApi.Input();
    inputStruct.type = NativeWinApi.INPUT_KEYBOARD;
    inputStruct.ki.wVk = 0;
    inputStruct.ki.wScan = input;
    inputStruct.ki.time = 0;
    var flags = NativeWinApi.KEYEVENTF_UNICODE;
    inputStruct.ki.dwFlags = flags;
    inputStruct.ki.dwExtraInfo = NativeWinApi.GetMessageExtraInfo();

    NativeWinApi.Input[] ip = { inputStruct };
    NativeWinApi.SendInput(1, ip, Marshal.SizeOf(inputStruct));
}

Спасибо всем за помощь.

...