2017-01-04 13 views
1

注:入力言語とキーボードレイアウトは同じではありません。 1つの入力言語は複数のレイアウトを持つことができます(例:米国英語とDvorak、Dvorak Left、およびDvorak Right)。C# - 入力言語のキーボードレイアウトの変更(例:ギリシャ語の下でギリシャ語(319)を設定)

私は、Windows 7のほぼすべてのキーボードレイアウトをテストするためのプログラムを作成しています。私のプログラムでは入力言語を変更できましたが、入力言語に複数のレイアウトがある場合デフォルトのものに変更してください。これは、米国英語(複数のDvorakレイアウト)、ギリシャ語(ギリシャ語220、ギリシャ語319、ギリシア語ポリトニックなど)の問題です。

私は現在、入力言語を変更するために使用していたコードは次のとおりです。

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を持っている、とプロパティを処理します。問題は、同じ入力言語(例えば、Dvorakとデフォルトの米国英語)のレイアウトの間に、同じCulture情報(LCIDとKeyboardLayoutIDはどちらも1033です)が異なるが、LayoutNameとHandlesが異なることです。しかし、アプリケーションの言語を変更する唯一の方法は、私が知る限り、Cultureを使用することです。

+0

Handleプロパティが意味のある値を持つ数少ないケースの1つです。それを16進数に変換するとパターンが表示され、下位と上位の両方にデフォルトレイアウトの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)); 

私は私のためにテスト中の最もエレガントなソリューションではありません、私は必要なレイアウトの変更が、言語をハードコーディングすることを計画アプリケーションはおそらく変更されないので、私は解決策としてこれで問題ありません。

関連する問題