2008年11月26日 星期三

應用程式如何得知 "控制台" --> "地區語言選項" 的改變

系統事件的使用者喜好設定變更時可以藉由 命名空間Microsoft.Win32 的 SystemEvents.UserPreferenceChanged 事件進行通知,

以下程式是註冊該事件

Visual Basic
AddHandler SystemEvents.UserPreferenceChanged, AddressOf SystemEvents_UserPreferenceChanged DisplayCultureInfo()
C#
SystemEvents.UserPreferenceChanged += new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);

它的事件參數 UserPreferenceChangedEventArgs 的 Category 屬性會傳入變更的事件類別, 如果是 "地區語言選項" 的改變, 是 UserPreferenceCategory.Locale

事件程序如下:

Visual Basic
Sub SystemEvents_UserPreferenceChanged(ByVal sender As Object, ByVal e As Microsoft.Win32.UserPreferenceChangedEventArgs)
        If e.Category = UserPreferenceCategory.Locale Then
            DisplayCultureInfo()
        End If
    End Sub
C#
static void SystemEvents_UserPreferenceChanged(object sender, UserPreferenceChangedEventArgs e)
{
if (e.Category== UserPreferenceCategory.Locale )
DisplayCultureInfo();
}

Thread.CurrentThread.CurrentCulture 會回傳目前執行緒的文化特性, 只有應用程式載入初期會寫入這個值, 所以控制台改變, 這個值並不會跟著異動, 若要取得控制台最新的文化特性, 必須先將目前的快取資料清除, 呼叫ClearCachedData 方法. 當快取被清除時, 將會自動取得控制台最新的設定.

Visual Basic
    Sub DisplayCultureInfo()
        Thread.CurrentThread.CurrentCulture.ClearCachedData()
        Dim UsersCulture As CultureInfo = Thread.CurrentThread.CurrentCulture
        Dim region As New RegionInfo(UsersCulture.Name)
        Console.WriteLine(region.DisplayName)
        Console.WriteLine(region.EnglishName)
        Console.WriteLine(region.NativeName)
        Console.WriteLine(region.CurrencyEnglishName)
        Console.WriteLine(region.CurrencyNativeName)
    End Sub
C#
private static void DisplayCultureInfo()  
{
Thread.CurrentThread.CurrentCulture.ClearCachedData();
CultureInfo UsersCulture = Thread.CurrentThread.CurrentCulture;
RegionInfo region = new RegionInfo(UsersCulture.Name);
Console.WriteLine(region.DisplayName);
Console.WriteLine(region.EnglishName);
Console.WriteLine(region.NativeName);
Console.WriteLine(region.CurrencyEnglishName);
Console.WriteLine(region.CurrencyNativeName);
}

沒有留言:

張貼留言