1

フォーカスされているプログラムのレイアウトを変更するプログラムを作成します。現在のキーボード レイアウトの ID を取得するコードがあります。

const int KL_NAMELENGTH = 9;
    const uint KLF_ACTIVATE = 1;

    [DllImport("user32.dll")]
    public static extern long LoadKeyboardLayout(string pwszKLID, uint Flags);
    [DllImport("user32.dll")]
    public static extern long GetKeyboardLayoutName(System.Text.StringBuilder pwszKLID);

    public static string getKLName()
    {
        System.Text.StringBuilder name = new System.Text.StringBuilder(KL_NAMELENGTH);
        GetKeyboardLayoutName(name);
        return name.ToString();
    }

例: EN - "00000409" DE- "00000407" FR- "0000040C"

また、次のコードがあります。

[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool PostMessage(IntPtr hWnd, int Msg, int wParam, int lParam);    

 private void ChangeLang(String code)
 {

   PostMessage(GetForegroundWindow(), 0x0050, 2, 0);

 }

現在、関数ChangeLangを呼び出すと、プログラムは現在の言語を次の言語に切り替えます。しかし、どのレイアウト スイッチ (コード レイアウトを使用) で、ChangeLang が他のプログラムにメッセージを渡したかを機能させるために必要です。これはどのように行うことができますか?

4

1 に答える 1

0
[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;

private const string en_US = "00000409";

private static void ChangeLanguage(string code)
{
    PostMessage(GetForegroundWindow(), WM_INPUTLANGCHANGEREQUEST, IntPtr.Zero, LoadKeyboardLayout(code, KLF_ACTIVATE));
}
于 2013-06-11T05:16:15.977 に答える