オンスクリーンキーボードを設計していますが、
ユーザーが設定した言語と、他のスレッドで現在使用している言語を特定する必要があります。
つまり、タスクバーの言語スイッチャーで選択されている言語を知る必要があります。
PSの現在のカルチャは、オンスクリーンキーボードアプリケーションで使用されている言語を返しますが、私が探しているのはそうではありません。
オンスクリーンキーボードを設計していますが、
ユーザーが設定した言語と、他のスレッドで現在使用している言語を特定する必要があります。
つまり、タスクバーの言語スイッチャーで選択されている言語を知る必要があります。
PSの現在のカルチャは、オンスクリーンキーボードアプリケーションで使用されている言語を返しますが、私が探しているのはそうではありません。
解決策は、フォアグラウンド ウィンドウのキーボード レイアウトを取得し、それをオンスクリーン キーボードに適用して、通常の方法で言語を確認することでした。
IntPtr fore = GetForegroundWindow();
uint tpid = GetWindowThreadProcessId(fore, IntPtr.Zero);
IntPtr hKL = GetKeyboardLayout(tpid);
hKL = (IntPtr)(hKL.ToInt32() & 0x0000FFFF);
InputLanguageManager m = InputLanguageManager.Current;
m.CurrentInputLanguage = new System.Globalization.CultureInfo(hKL.ToInt32());
//IntPtr i = LoadKeyboardLayout(hKL.ToString(), 1);
InputLanguage = InputLanguageManager.Current.CurrentInputLanguage.ToString();
WMIを使用して取得することもできます。
using System;
using System.Management;
using System.Windows.Forms;
namespace WMISample
{
public class MyWMIQuery
{
public static void Main()
{
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_BIOS");
foreach (ManagementObject queryObj in searcher.Get())
{
Console.WriteLine("-----------------------------------");
Console.WriteLine("Win32_BIOS instance");
Console.WriteLine("-----------------------------------");
Console.WriteLine("CurrentLanguage: {0}", queryObj["CurrentLanguage"]);
}
}
catch (ManagementException e)
{
MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}
}
}
}