C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: OSのカルチャを取得したい


(過去ログ 81 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■47733 / inTopicNo.1)  OSのカルチャを取得したい
  
□投稿者/ デザパタ (1回)-(2010/03/12(Fri) 16:40:48)

分類:[C#] 

現在のスレッドのカルチャは
System.Threading.Thread.CurrentThread.CurrentCulture
で取得できると思いますが、コントロールパネルでカルチャを変更しても
現在のスレッドのカルチャには反映されないようです(スレッドを起動し直したら大丈夫)。

OSの現在のカルチャはどうやって取得できるんでしょうか?

引用返信 編集キー/
■47736 / inTopicNo.2)  Re[1]: OSのカルチャを取得したい
□投稿者/ Hongliang (566回)-(2010/03/12(Fri) 17:10:27)
CultureInfo.CurrentCulture の MSDN の解説によると
> 取得されるカルチャは、実行中のスレッドのプロパティです。
> この読み取り専用プロパティは、Thread.CurrentCulture を返します。
> スレッドを開始すると、そのカルチャは、最初に Windows API から
> GetUserDefaultLCID を使用することによって確認されます。
だそうですから、自分で GetUserDefaultLCID を呼び出せば良いんじゃないでしょうかね。
引用返信 編集キー/
■47738 / inTopicNo.3)  Re[1]: OSのカルチャを取得したい
□投稿者/ みきぬ (819回)-(2010/03/12(Fri) 17:34:58)
> 現在のスレッドのカルチャには反映されないようです(スレッドを起動し直したら大丈夫)。
>
ということは、新しくスレッドを作ってそこで取得すればいいのかも。

※自分では試してないです。
※それだけのためにスレッドを作るのってどうよ(←自己つっこみ)
引用返信 編集キー/
■47743 / inTopicNo.4)  Re[2]: OSのカルチャを取得したい
□投稿者/ 渋木宏明(ひどり) (1291回)-(2010/03/12(Fri) 19:52:48)
渋木宏明(ひどり) さんの Web サイト
> ということは、新しくスレッドを作ってそこで取得すればいいのかも。

どうなのかなぁ?

そのスレッドを開始したスレッドのカルチャが引き継がれるような気も。

# スレッド起動時に外部からそのすれっどのカルチャって指定することできたっけ?(単なる興味)
引用返信 編集キー/
■47746 / inTopicNo.5)  Re[2]: OSのカルチャを取得したい
□投稿者/ デザパタ (2回)-(2010/03/12(Fri) 20:44:44)
みなさん、ありがとうございます。

No47736 (Hongliang さん) に返信
> CultureInfo.CurrentCulture の MSDN の解説によると
>>取得されるカルチャは、実行中のスレッドのプロパティです。
>>この読み取り専用プロパティは、Thread.CurrentCulture を返します。
>>スレッドを開始すると、そのカルチャは、最初に Windows API から
>>GetUserDefaultLCID を使用することによって確認されます。
> だそうですから、自分で GetUserDefaultLCID を呼び出せば良いんじゃないでしょうかね。

検討してみます。

No47743 (渋木宏明(ひどり) さん) に返信
>> ということは、新しくスレッドを作ってそこで取得すればいいのかも。

>どうなのかなぁ?

>そのスレッドを開始したスレッドのカルチャが引き継がれるような気も。

確認してみたところ、引き継がれますね。

スレッドを起動し直したら大丈夫と言ったのもメインスレッドのことでして、
つまりはプログラムを起動し直したらという意味です。

引用返信 編集キー/
■47747 / inTopicNo.6)  Re[3]: OSのカルチャを取得したい
□投稿者/ デザパタ (3回)-(2010/03/12(Fri) 21:03:56)
No47743 (渋木宏明(ひどり) さん) に返信

> # スレッド起動時に外部からそのすれっどのカルチャって指定することできたっけ?(単なる興味)

スレッドにはカルチャを設定するプロパティがあるので、Startする前に設定すればそのカルチャが有効になります。
(呼び出し元のスレッドのカルチャ設定に影響はないようです)
引用返信 編集キー/
■47748 / inTopicNo.7)  Re[3]: OSのカルチャを取得したい
□投稿者/ みきぬ (820回)-(2010/03/12(Fri) 21:28:17)
No47746 (デザパタ さん) に返信
> ■No47743 (渋木宏明(ひどり) さん) に返信
> >> ということは、新しくスレッドを作ってそこで取得すればいいのかも。
>
> >どうなのかなぁ?
>
> >そのスレッドを開始したスレッドのカルチャが引き継がれるような気も。
>
> 確認してみたところ、引き継がれますね。
>
> スレッドを起動し直したら大丈夫と言ったのもメインスレッドのことでして、
> つまりはプログラムを起動し直したらという意味です。
>
おお、わざわざ確認してもらってすいません。

で懲りずにもう一つ思いつきですが、CultureInfo.ClearCachedData メソッドを使うとどうかしら。
MSDN を読んだ限りではうまくいきそうだと思うんだけども。
引用返信 編集キー/
■47755 / inTopicNo.8)  Re[1]: OSのカルチャを取得したい
□投稿者/ aetos (248回)-(2010/03/13(Sat) 02:56:49)
No47733 (デザパタ さん) に返信
> 現在のスレッドのカルチャは
> System.Threading.Thread.CurrentThread.CurrentCulture
> で取得できると思いますが、コントロールパネルでカルチャを変更しても
> 現在のスレッドのカルチャには反映されないようです(スレッドを起動し直したら大丈夫)。
>
> OSの現在のカルチャはどうやって取得できるんでしょうか?

Thread.CurrentCulture は GetUserDefaultLCID だそうですが、Windows にはこのテの関数が山とあって、どれがどれだかわかりません。

GetSystemDefaultLCID
GetUserDefaultLCID
GetThreadLocale

GetSystemPreferredUILanguages
GetUserPreferredUILanguages
GetProcessPreferredUILanguages
GetThreadPreferredUILanguages

GetSystemDefaultUILanguage
GetUserDefaultUILanguage
GetThreadUILanguage
引用返信 編集キー/
■47761 / inTopicNo.9)  Re[4]: OSのカルチャを取得したい
□投稿者/ 渋木宏明(ひどり) (1293回)-(2010/03/13(Sat) 09:15:05)
渋木宏明(ひどり) さんの Web サイト
>># スレッド起動時に外部からそのすれっどのカルチャって指定することできたっけ?(単なる興味)
>
> スレッドにはカルチャを設定するプロパティがあるので、Startする前に設定すればそのカルチャが有効になります。
> (呼び出し元のスレッドのカルチャ設定に影響はないようです)

確認ありがとうございます (^^;
やぱスレッド起動前に指定できないと都合が悪い時もありそーですもんね。
引用返信 編集キー/
■47762 / inTopicNo.10)  Re[3]: OSのカルチャを取得したい
□投稿者/ 渋木宏明(ひどり) (1294回)-(2010/03/13(Sat) 09:21:03)
渋木宏明(ひどり) さんの Web サイト
2010/03/13(Sat) 11:35:03 編集(投稿者)
2010/03/13(Sat) 11:34:43 編集(投稿者)

> >そのスレッドを開始したスレッドのカルチャが引き継がれるような気も。
>
> 確認してみたところ、引き継がれますね。

やはりそうですか。

システム設定を変更したからといって、いきなりプロセスやスレッドのカレントカルチャが変わってしまったらマズイ(表示や入力規則などなどに影響あるはず)ですもんね。

とすると、プロセスやスレッドに設定されているカルチャではなく、「システム設定を取得する」という観点で調査しないと、元投稿の目的は達成できなさそうな…

そもそもの目的は、コンパネでのカルチャ設定をすぐさまアプリケーションに反映させたい、ということなんですかね?(できるのかな?)

引用返信 編集キー/
■47775 / inTopicNo.11)  Re[5]: OSのカルチャを取得したい
□投稿者/ デザパタ (4回)-(2010/03/15(Mon) 08:50:10)
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設定変更時に反映させるのもありかなとも考えていたので今後の参考にしたいと思います。

みなさん、どうもありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -