在 C# 中,如何在 Windows 10 的“区域和语言”下选择“国家或地区”?

Posted

技术标签:

【中文标题】在 C# 中,如何在 Windows 10 的“区域和语言”下选择“国家或地区”?【英文标题】:In C#, how to get the "Country or region" selected under "Region & language" in Windows 10? 【发布时间】:2017-09-14 07:13:30 【问题描述】:

我运行的是 Windows 10。当我从开始菜单打开“区域和语言设置”时,我可以选择“国家或地区”。我正在尝试在 C# 程序中获取此值。

我在丹麦。我尝试将我的国家/地区更改为德国(请参阅screenshot),但我无法获得返回德国的代码。重新启动计算机没有帮助。

我写了一些受this thread启发的代码。

我的代码看起来像这样(一次尝试各种事情,得到我能想到的所有地区/文化):

private static void Main(string[] args)

    Thread.CurrentThread.CurrentCulture.ClearCachedData();
    Thread.CurrentThread.CurrentUICulture.ClearCachedData();
    var thread = new Thread(() => ((Action) (() =>
    
        Console.WriteLine("Current culture: 0", Thread.CurrentThread.CurrentCulture.Name);
        Console.WriteLine("Current UI culture: 0", Thread.CurrentThread.CurrentUICulture.Name);
        Console.WriteLine("Installed UI culture: 0", CultureInfo.InstalledUICulture.Name);
        Console.WriteLine("Current region: 0", RegionInfo.CurrentRegion.ThreeLetterISORegionName);
        Console.WriteLine("System default LCID: 0", GetSystemDefaultLCID());
    ))());
    thread.Start();
    thread.Join();
    Console.ReadKey();


[DllImport("kernel32.dll")]
private static extern uint GetSystemDefaultLCID();

它输出:

Current culture: en-DK
Current UI culture: en-US
Installed UI culture: en-US
Current region: DNK
System default LCID: 1033

如何让我的程序检测到我选择了德国?我需要调用什么方法或属性?并且可能需要重新启动或清除缓存?

【问题讨论】:

RegionInfo.CurrentRegion。是时候升级您的 Google-Fu 了。 区域控制面板[Win32]中存在一个“管理”选项卡,而不是现代设置选项卡。单击“复制设置”和“更改系统区域设置”。可能会解决你的问题 我终于在这个帖子中找到了我的问题的答案:***.com/questions/8879259/… @SamAxe:我确实尝试过 RegionInfo.CurrentRegion。如我原来的帖子所示,它返回了丹麦 (DNK)。 【参考方案1】:

我在this thread找到了我的问题的答案。

我正在使用下面的代码,正如@SanjaySingh 在该线程中提出的那样,只是稍作修改。

如果我调用 GetMachineCurrentLocation 并将 geoFriendlyname 参数设置为 5,我会得到我想要的三字母 ISO 区域代码(对于德国,这是 "DEU")。

geoFriendlyname 的值可以在here 中找到。

public static class RegionAndLanguageHelper

    #region Constants

    private const int GEO_FRIENDLYNAME = 8;

    #endregion

    #region Private Enums

    private enum GeoClass : int
    
        Nation = 16,
        Region = 14,
    ;

    #endregion

    #region Win32 Declarations

    [DllImport("kernel32.dll", ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
    private static extern int GetUserGeoID(GeoClass geoClass);

    [DllImport("kernel32.dll")]
    private static extern int GetUserDefaultLCID();

    [DllImport("kernel32.dll")]
    private static extern int GetGeoInfo(int geoid, int geoType, StringBuilder lpGeoData, int cchData, int langid);

    #endregion

    #region Public Methods

    /// <summary>
    /// Returns machine current location as specified in Region and Language settings.
    /// </summary>
    /// <param name="geoFriendlyname"></param>
    public static string GetMachineCurrentLocation(int geoFriendlyname)
    
        int geoId = GetUserGeoID(GeoClass.Nation); ;
        int lcid = GetUserDefaultLCID();
        StringBuilder locationBuffer = new StringBuilder(100);
        GetGeoInfo(geoId, geoFriendlyname, locationBuffer, locationBuffer.Capacity, lcid);

        return locationBuffer.ToString().Trim();
    

    #endregion

【讨论】:

您能告诉我您传递给GetMachineCurrentLocation(?) 的内容以及调用GetMachineCurrentLocation() 方法得到了什么吗? 在我的情况下:var test = RegionAndLanguageHelper.GetMachineCurrentLocation(RegionInfo.CurrentRegion.GeoId); => test 是“”(空)【参考方案2】:

Read msdn documentation: RegionInfo Properties

var regionInfo = RegionInfo.CurrentRegion;
var name = regionInfo.Name;
var englishName = regionInfo.EnglishName;
var displayName = regionInfo.DisplayName;

Console.WriteLine("Name: 0", name);
Console.WriteLine("EnglishName: 0", englishName);
Console.WriteLine("DisplayName: 0", displayName);   

名称:DE 英文名称:Germany 显示名称:德国

【讨论】:

我试过了,如我原来的帖子所示。它没有帮助。当我在“区域和语言设置”中更改我的国家/地区时,CurrentThread.CurrentCulture 没有改变。 @ClausAppel 你试过var regionInfo = RegionInfo.CurrentRegion;吗?为我工作。 @ClausAppel,来自 msdn:“RegionInfo 类不会自动检测系统设置的变化,但在调用ClearCachedData 方法时会更新CurrentRegion 属性” i>. 是的,我试过RegionInfo.CurrentRegion。我在我原来的帖子中展示了这一点。为了刷新RegionInfo.CurrentRegion,我需要调用哪个CultureInfo 对象ClearCachedData?我在原始代码中尝试了一些 ClearCachedData 调用,但它们没有帮助。 @ClausAppel,我在我的电脑上尝试了这个答案代码(win10,德国被选为国家),奇怪的是它显示en-US。所以确实是哪里出了问题。【参考方案3】:

比选择的答案短得多,并且不需要 DllImports 或 ClearCachedData:

var regKeyGeoId = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Control Panel\International\Geo");
var geoID = (string)regKeyGeoId.GetValue("Nation");
var allRegions = CultureInfo.GetCultures(CultureTypes.SpecificCultures).Select(x => new RegionInfo(x.ToString()));
var regionInfo = allRegions.FirstOrDefault(r => r.GeoId == Int32.Parse(geoID));
Console.WriteLine("EnglishName:" + regionInfo.EnglishName);
Console.WriteLine("DisplayName:" + regionInfo.DisplayName);
Console.WriteLine("NativeName:" + regionInfo.NativeName);
Console.WriteLine("ISOCurrencySymbol:" + regionInfo.ISOCurrencySymbol);
Console.WriteLine("Name:" + regionInfo.Name);

这会读取您在 Windows 10 中“区域和语言”>“国家或地区”下设置的信息。

感谢@Zan,因为我的只是他帖子的延伸:Get Current Location (as specified in Region and Language) in C#

【讨论】:

【参考方案4】:

试试

    var geographicRegion = new Windows.Globalization.GeographicRegion();
    var code = geographicRegion.CodeTwoLetter;

    var region = Windows.System.UserProfile.GlobalizationPreferences.HomeGeographicRegion;

【讨论】:

这是 UWP 解决方案。

以上是关于在 C# 中,如何在 Windows 10 的“区域和语言”下选择“国家或地区”?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 从 Windows 10 日历中检索 UWP 中的约会

如何在Win10系统内设置多时区时钟

如何从 C# 授予 Windows 10 中 Pcap 库的权限?

如何在 C# 中检查 Windows 许可证状态?

如何在c#中播放特定的Windows错误声音[重复]

如何在 C# windows 窗体中使用事件作为方法?