Как отправлять скандинавские письма с помощью SendInput

Я пытаюсь создать виртуальную клавиатуру, которая имитирует клавиатуру с помощью метода SendInput следующим образом:

        public static void SendKeyDown(System.Windows.Forms.Keys key)
        {
            INPUT k = new INPUT();
            k.type = (int)InputType.INPUT_KEYBOARD;
            k.ki.wVk = (short)key;
            k.ki.dwFlags = (int)KEYEVENTF.KEYDOWN;
            k.ki.dwExtraInfo = GetMessageExtraInfo();

            SendInput(1, new INPUT[] { k }, Marshal.SizeOf(k));
        }

Но я не могу найти скандинавские буквы Ä, Ö и Å из Keys-enumeration. Как я могу отправить эти письма, используя метод SendInput?


person Jaska    schedule 15.03.2013    source источник
comment
Вы программист: напишите программу, чтобы ответить на ваш вопрос. Напишите форму, которая обрабатывает событие KeyDown и отображает свойство KeyEventArgs.KeyCode, нажмите клавишу, посмотрите, что произойдет.   -  person Eric Lippert    schedule 16.03.2013
comment
Ага! Почему я не подумал об этом!?! Спасибо! :)   -  person Jaska    schedule 16.03.2013
comment
И правильный ответ был: Oem3 = ö, Oem7 = ä, Oem6 = å   -  person Jaska    schedule 16.03.2013
comment
Теперь помните, что эти коды действительны только в том случае, если у вашего клиента такая же клавиатура, как у вас. OEM означает производителя оригинального оборудования; производитель клавиатуры должен решить, каковы привязки клавиш.   -  person Eric Lippert    schedule 16.03.2013


Ответы (2)


Вы можете отправлять символы Unicode, используя KEYEVENTF_UNICODE.

k.type = (int)InputType.INPUT_KEYBOARD;
k.ki.wScan = 'ö';
k.ki.wVk = 0;
k.ki.dwFlags = (int)KEYEVENTF.UNICODE | (int)KEYEVENTF.KEYDOWN;
k.ki.dwExtraInfo = GetMessageExtraInfo();

Это более переносимо, чем ваше решение с использованием Oem3 и др., чей назначенный персонаж будет варьироваться в зависимости от культуры платформы, на которой выполняется ваше приложение.

(Остальные подписи P/Invoke можно найти в моем другом ответе.)

person Douglas    schedule 15.03.2013
comment
Просто обратите внимание, что при использовании KEYEVENTF_UNICODE wScan является кодовой единицей UTF-16. Если вы хотите отправить кодовую точку Unicode, для которой требуется суррогатная пара UTF-16 (ö не требует), вы должны отправить два события, по одному для каждой кодовой единицы пары. - person Remy Lebeau; 28.07.2016

Сам нашел решение:

Oem3 = ö, Oem7 = ä, Oem6 = å

person Jaska    schedule 15.03.2013