【问题标题】:How to programatically retrieve the "Location" as displayed in the Regional and Language Settings?如何以编程方式检索区域和语言设置中显示的“位置”?
【发布时间】:2011-01-23 15:44:11
【问题描述】:

如何以编程方式检索区域和语言设置中显示的“位置”?

alt text http://dl.dropbox.com/u/3978473/location.png

【问题讨论】:

    标签: windows winapi windows-7 windows-vista windows-xp


    【解决方案1】:

    HKEY_CURRENT_USER\控制面板\国际\地理

    我不知道,如何将数字转换为国家名称:(

    【讨论】:

    【解决方案2】:

    这是您将从前面提到的注册表项中检索到的 GeoID 列表:(它们是十六进制的)

    http://msdn.microsoft.com/en-us/library/dd374073%28VS.85%29.aspx

    条目:

    HKEY_CURRENT_USER\Control Panel\International\Geo
    

    【讨论】:

      【解决方案3】:

      有一个 API 函数可以返回所选位置的 GEOID:

      GEOID locationId = GetUserGeoID(GEOCLASS_NATION);
      

      http://msdn.microsoft.com/en-us/library/dd318138(v=VS.85).aspx

      【讨论】:

        【解决方案4】:

        也许有用的代码(C#)

        private const int GEOCLASS_NATION = 16;
        
        //SYSGEOTYPE
        private const int GEO_NATION = 1;
        private const int GEO_LATITUDE = 2;
        private const int GEO_LONGITUDE = 3;
        private const int GEO_ISO2 = 4;
        private const int GEO_ISO3 = 5;
        private const int GEO_RFC1766 = 6;
        private const int GEO_LCID = 7;
        private const int GEO_FRIENDLYNAME = 8;
        private const int GEO_OFFICIALNAME = 9;
        private const int GEO_TIMEZONES = 10;
        private const int GEO_OFFICIALLANGUAGES = 11;
        
        
        #region Win32 Declarations
        
        // [DllImport("kernel32.dll", ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
        // private static extern int GetUserGeoID(GeoClass geoClass);
        
        [DllImport("kernel32.dll")]
        static extern int GetUserGeoID(int geoId);
        
        [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
        
        
        
        private string GetGeoFriendlyName(int geoId)
        {
            int lcid = GetUserDefaultLCID();
            StringBuilder bldr = new StringBuilder(50);
            GetGeoInfo(geoId, GEO_FRIENDLYNAME, bldr, bldr.Capacity, lcid);
            return bldr.ToString();
        }
        
        private string GetGeoIso2(int geoId)
        {
            int lcid = GetUserDefaultLCID();
            StringBuilder bldr = new StringBuilder(50);
            GetGeoInfo(geoId, GEO_ISO2, bldr, bldr.Capacity, lcid);
            return bldr.ToString();
        }
        
        
        
        
             // HKEY_CURRENT_USER\Control Panel\International\Geo"
            using (var regKeyGeo = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@"Control Panel\International\Geo"))
            {
                 var NationValue = Convert.ToInt32(regKeyGeo.GetValue("Nation").ToString());
        
                 int geoId = GetUserGeoID(GEOCLASS_NATION);
                 string friendlyName = GetGeoFriendlyName(geoId);
                 Response.Write("GetUserGeoID: " + geoId + " - friendlyName: " + friendlyName + @". HKEY_CURRENT_USER\Control Panel\International\Geo - Nation: " + NationValue + " - " + GetGeoFriendlyName(NationValue));
        
                 var iso2 = GetGeoIso2(geoId);
                 Response.Write(" - GetGeoIso2: " + iso2);
        
                 var regionGeo = new RegionInfo(iso2);
                Response.Write(" - " + regionGeo.DisplayName + " - " + regionGeo.ISOCurrencySymbol);
        
                var cultureInfo = CultureInfo.GetCultures(CultureTypes.AllCultures).Where(c => c.Name.EndsWith(iso2));
        
                var culture = cultureInfo.ToList()[0];
                Response.Write("<br /> Culture for " + iso2 + ": " + culture.DisplayName + " - " + culture.DateTimeFormat.FullDateTimePattern);
            }
        

        【讨论】:

        • 真的,我用[DllImport("kernel32.dll")] static extern int GetUserGeoID(int geoId);
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        相关资源
        最近更新 更多