2017-01-04 1 views
1

Примечание. Языки ввода и раскладки клавиатуры - это не одно и то же. Один язык ввода может иметь несколько макетов (например, американский английский и Дворжак, Дворак слева и Дворжак справа).C# - Изменение языка ввода. Разметка клавиатуры (пример: установка греческого языка (319) под греческий язык)

Я пишу программу, которая будет использоваться для тестирования почти каждой раскладки клавиатуры в Windows 7. Я успешно смог изменить язык ввода в моей программе, но если на языке ввода есть несколько макетов, я могу только измените значение по умолчанию. Это проблема для английского языка США (несколько макетов Dvorak), греческий (включает в себя греческий 220, греческий 319, греческий Polytonic и т. Д.).

Код настоящее время я использую для изменения входных языков:

string cultureChange = "{en-US}"; //just an example 
InputLanguage nextLang = InputLanguage.FromCulture(cultureChange); 
ChangeInputLanguage(nextLang); 

public void ChangeInputLanguage(InputLanguage InputLang) 
{ 
    // Check is this Language really installed. Raise exception to warn if it is not: 
    if (InputLanguage.InstalledInputLanguages.IndexOf(InputLang) == -1) 
     throw new ArgumentOutOfRangeException(); 
    // InputLanguage changes here: 
    InputLanguage.CurrentInputLanguage = InputLang; 
} 

Входные Языки есть культура, LayoutName, и обрабатывать свойства. Проблема заключается в том, что между макетами одного и того же входного языка (ex Dvorak и по умолчанию US English) оба имеют точно такую ​​же информацию о культуре (LCID и KeyboardLayoutID - 1033 для обоих), но разные LayoutNames и Handles. Насколько мне известно, единственный способ изменить язык приложения - использовать Культуру.

+0

Один из немногих случаев, когда свойство Handle имеет значимое значение. Преобразуйте его в шестнадцатеричный, и вы увидите шаблон, низкое и высокое слово содержат LCID для макета по умолчанию. Итак, 0x04090409 для США. –

ответ

0

Я искал свой путь к некоторому коду, который работает, отправляя ответ, если кому-то нужна эта информация. Я понятия не имею, что означает этот код, но он, похоже, работает.

public partial class myForm : Form 
{ 
    [DllImport("user32.dll")] 
    private static extern long GetKeyboardLayoutName(
      System.Text.StringBuilder pwszKLID); 
    [DllImport("user32.dll")] 
    private static extern bool PostMessage(IntPtr hhwnd, uint msg, IntPtr wparam, IntPtr lparam); 
    [DllImport("user32.dll")] 
    private static extern IntPtr LoadKeyboardLayout(string pwszKLID, uint Flags); 
    [DllImport("user32.dll")] 
    public static extern IntPtr GetForegroundWindow(); 

    private const uint WM_INPUTLANGCHANGEREQUEST = 0x0050; 
    private const uint KLF_ACTIVATE = 1; 
//etc more form code 

, а затем в кнопку пресс-конференции:

//Gets current keyboard layout 
StringBuilder name = new StringBuilder(9); 
GetKeyboardLayoutName(name); 
String KeyBoardLayout = name.ToString(); 
//Changes current layout to Dvorak (which is 00010409) 
PostMessage(GetForegroundWindow(), WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, LoadKeyboardLayout("00010409", KLF_ACTIVATE)); 

Я планирую закодировав изменения макета, мне нужно, что не самое элегантное решение, но языки тестируемой для моего приложение, вероятно, не изменится, поэтому я в порядке с этим в качестве решения.

Смежные вопросы