Sendkeys.Send () для правой клавиши alt? любые альтернативы?

Я работаю над приложением winform для монитора с сенсорным экраном. Приложение состоит из веб-браузера и экранной клавиатуры. У меня есть почти все, что мне нужно, но проблема, с которой я столкнулся, заключается в том, что есть два языка ввода, английский и корейский. Любой, кто знаком с использованием двух языков, может сказать вам, что правая клавиша alt используется для переключения между языками. Мне нужно смоделировать это нажатие клавиши, но я ничего не могу найти для этого.

Я нашел способы имитировать клавиши shift влево / вправо и клавиши ctrl влево / вправо. Но ничего для левой / правой клавиш alt.

Есть ли у меня альтернативы?


person Erick Ely    schedule 17.02.2012    source источник
comment
Я использую комбинацию Left Alt / Left Shift для переключения клавиатур с помощью встроенной языковой панели в Windows. Взгляните на диалог настроек языковой панели. Возможно, вы можете настроить сочетание клавиш на то, что вам больше подходит.   -  person Anders Marzi Tornblad    schedule 17.02.2012


Ответы (4)


Вы можете использовать keybd_event с RALT кодом клавиши VK_RMENU. Полный список кодов клавиш можно найти здесь

Вам нужно будет P / Invoke нажать следующим образом:

[DllImport("user32.dll", SetLastError = true)] 
static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);  

public const int KEYEVENTF_EXTENDEDKEY = 0x0001; //Key down flag 
public const int KEYEVENTF_KEYUP = 0x0002; //Key up flag 
public const int VK_RMENU = 0xA5;

keybd_event(VK_RMENU, 0, KEYEVENTF_EXTENDEDKEY, 0); 
keybd_event(VK_RMENU, 0, KEYEVENTF_KEYUP, 0); 
person Bali C    schedule 17.02.2012
comment
Нет необходимости использовать P / Invoke и снова изобретать колесо! Keys.RMenu эквивалентно VK_RMENU. - person Mohammad Dehghan; 17.02.2012
comment
Я использовал то, что вы мне дали, и расширенный ключ работает нормально, но похоже, что он не выпускается. если я что-то набираю и нажимаю клавишу Backspace, это больше работает как функция отмены. - person Erick Ely; 17.02.2012

Вам не нужно имитировать нажатия клавиш Alt + Shift для изменения языка ввода. Вы можете использовать класс InputLanguage в пространстве имен System.Windows.Forms:

        var currentLang = InputLanguage.CurrentInputLanguage;
        var installedLangs = InputLanguage.InstalledInputLanguages;
        if (installedLangs.Count > 1)
            InputLanguage.CurrentInputLanguage =
                installedLangs[1 - installedLangs.IndexOf(currentLang)];

Если у вас установлено ровно 2 языка ввода, эти фрагменты кода переключаются между ними. Вы уловили идею. Правильно?

person Mohammad Dehghan    schedule 17.02.2012
comment
Круто, мне удалось пропустить то. Хотя вроде это часть фреймворка Winforms. Вероятно, есть эквивалент для WPF. - person Avner Shahar-Kashtan; 17.02.2012
comment
Я делаю, потому что сайт принудительно вводит корейский язык, имеет ли пользователь корейский язык в качестве активного ввода. - person Erick Ely; 17.02.2012

Вы действительно не хотите найти способ отправить клавишу Alt, верно? Что вам действительно нужно, так это иметь возможность изменять язык ввода. В таком случае сразу переходите к источнику.

В Windows API есть методы для изменения текущей активной раскладки клавиатуры. Они не являются частью .NET Framework, но вы можете использовать P / Invoke для их вызова из C #.

Документация MSDN для ActivateKeyboardLayout находится здесь.

А подписи P / Invoke можно найти здесь.

person Avner Shahar-Kashtan    schedule 17.02.2012
comment
InputLanguage класс делает то, что вы ищете. И это доступно в .NET Framework! - person Mohammad Dehghan; 17.02.2012

MSDN дает RMenu запись перечисления для правого alt.

person Shimrod    schedule 17.02.2012