在C#中获取当前位置(如区域和语言中指定的位置)

9
我该如何获取系统区域与语言设置中指定的机器当前位置?我已经尝试从RegionInfo类中获取此信息,但它返回的是区域和语言中指定的格式下拉菜单中的位置。为了澄清我的意思,如果您打开计算机的控制面板中的区域和语言设置,我想读取在位置选项卡中指定的位置。 RegionInfo给出的值是指定格式选项卡中的格式下拉菜单。

3
@Sai,我认为楼主的意思是地理位置。 - Glenn
我认为他想要的是像乌克兰、美国、英国这样的“位置”,与文化无关。 - V4Vendetta
没错。例如,我可以将我的文化设为英语(美国),而我的位置设为印度。您可以在“地区和语言”控制面板中独立更改它们。 - Sanjay Singh
4个回答

18

经过大量的搜索,我终于得到了答案。以下两个链接帮助我获取当前机器位置:

http://social.msdn.microsoft.com/Forums/eu/csharpgeneral/thread/6dfaa142-c588-4cb0-b044-fa1e8138b299

http://www.siao2.com/2007/02/21/1733999.aspx

如果有兴趣查看最终代码,我编写了以下实用类:

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>
    public static string GetMachineCurrentLocation()
    {
        int geoId = GetUserGeoID(GeoClass.Nation); ;
        int lcid = GetUserDefaultLCID();
        StringBuilder locationBuffer = new StringBuilder(100);
        GetGeoInfo(geoId, GEO_FRIENDLYNAME, locationBuffer, locationBuffer.Capacity, lcid);

        return locationBuffer.ToString().Trim();
    }

    #endregion
}

2
这是唯一在多个操作系统上(如Win7 + Win8)工作的解决方案。我不明白为什么它没有得到评价... - Raffaeu
using (var regKeyGeo = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Control Panel\International\Geo")) { Response.Write("<br />Geo Nation " + regKeyGeo.GetValue("Nation").ToString()); } - Kiquenet
@Kiquenet 使用注册表是我绝对会避免的事情。这通常是未记录和不受支持的,你可以相当肯定它在某个时候会出问题。 - Poorkenny
太长了,不如@Zan下面所说的那么优雅。 - leoinlios

1

根据“控制面板>区域>家庭位置”,您可以获得RegionInfo。尝试以下操作 -

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));

这应该是被选中的答案 - 更短。另外,请参见 https://dev59.com/caXja4cB1Zd3GeqPMyjg#53972349 - leoinlios

1

你能试着使用

RegionInfo.CurrentRegion.DisplayName;

这个能够按照你的意图提供所需的位置名称吗?


我已经尝试过这个,但它给了我当前的格式而不是在区域和语言对话框(控制面板->区域和语言)中指定的当前位置。 - Sanjay Singh
无法工作。我的位置在日本,但上面显示的是“美国”。 - Dono
“控制面板:区域和语言选项->标准和格式”与“控制面板:区域和语言选项->位置”不同。 - Kiquenet

0

是的.. 但更简单:

CultureInfo info = CultureInfo.CurrentCulture;

2
那不起作用。例如,我的位置选项卡设置为日本。然而,上述代码生成了en-US。 - Dono
1
“控制面板:区域和语言选项->标准和格式”与“控制面板:区域和语言选项->位置”不同。 - Kiquenet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接