|
■No47736 (Hongliang さん) に返信
> CultureInfo.CurrentCulture の MSDN の解説によると
>>取得されるカルチャは、実行中のスレッドのプロパティです。
>>この読み取り専用プロパティは、Thread.CurrentCulture を返します。
>>スレッドを開始すると、そのカルチャは、最初に Windows API から
>>GetUserDefaultLCID を使用することによって確認されます。
> だそうですから、自分で GetUserDefaultLCID を呼び出せば良いんじゃないでしょうかね。
上記の関数を使うことで取得できました。
さらにOSのメッセージからコントールパネルで変更したタイミングで取得することもできるようです。
[DllImport("kernel32.dll", SetLastError = true)]
static extern int GetUserDefaultLCID();
private const int WM_SETTINGCHANGE = 0x001A;
CultureInfo lastCulture_ = new CultureInfo(GetUserDefaultLCID());
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_SETTINGCHANGE:
if (m.LParam != IntPtr.Zero)
{
int currentCultureID = GetUserDefaultLCID();
string val = Marshal.PtrToStringAuto(m.LParam);
if (val == "intl")
{
Thread thread = Thread.CurrentThread;
if (thread.CurrentCulture.LCID != currentCultureID &&
thread.CurrentCulture.LCID == lastCulture_.LCID)
{
// カルチャが変更された場合
thread.CurrentCulture = new CultureInfo(currentCultureID);
}
else
{
// カルチャの設定が変更された場合
thread.CurrentCulture.ClearCachedData();
}
lastCulture_ = new CultureInfo(currentCultureID);
}
}
break;
}
base.WndProc(ref m);
}
■No47762 (渋木宏明(ひどり) さん) に返信
>とすると、プロセスやスレッドに設定されているカルチャではなく、「システム設定を取得する」という観点で調査しないと、元投稿の目的は達成できなさそうな…
>そもそもの目的は、コンパネでのカルチャ設定をすぐさまアプリケーションに反映させたい、ということなんですかね?(できるのかな?)
そもそもの目的はアプリケーション自身で管理している言語設定を変更したタイミングでOSのカルチャを参照したいということでした。
でも、可能ならばOS設定変更時に反映させるのもありかなとも考えていたので今後の参考にしたいと思います。
みなさん、どうもありがとうございました。
|