2012-01-16 24 views
7

¿Cómo puedo obtener la ubicación actual de la máquina como se especifica en Región e idioma del sistema operativo? Ya he intentado obtener esto de la clase RegionInfo pero devuelve la ubicación como se especifica en el menú desplegable Formato de la región y el idioma.Obtener ubicación actual (como se especifica en Región e idioma) en C#

Solo para aclarar lo que quiero decir, si abre Region And Language desde el Panel de control de su máquina, quiero leer la ubicación como se especifica en la pestaña Ubicación. RegionInfo me da el valor especificado en el menú desplegable Formato de la pestaña Formatos.

+3

@Sai Creo que el OP significa la ubicación geográfica. – Glenn

+0

Creo que quiere la ubicación como en * Ucrania, Estados Unidos, Reino Unido * como sabio y nada que ver con la cultura – V4Vendetta

+0

Eso es correcto. Por ejemplo, puedo tener mi cultura como inglés (Estados Unidos) y mi ubicación como India. Puede cambiar ambos de forma independiente en el panel de control de Región e Idioma. –

Respuesta

2

sí .. pero más fácil:

CultureInfo info = CultureInfo.CurrentCulture; 
+0

Eso no funciona. Por ejemplo, mi pestaña de Ubicación está configurada en Japón. Sin embargo, el código anterior generó en-US. – Dono

+0

*** No igual *** 'Panel de control: Opciones regionales y de idioma-> Estándares y formatos 'que' Panel de control: Opciones regionales y de idioma-> Ubicación ' – Kiquenet

1

¿Se puede tratar de usar

RegionInfo.CurrentRegion.DisplayName;

¿Esto le da el nombre de ubicación requerida como usted tiene la intención

+0

He intentado esto pero me da el formato actual y no el la ubicación actual como se especifica en el cuadro de diálogo Región e idioma (Panel de control -> Región e idioma) –

+0

No funciona. Mi ubicación es Japón, pero lo anterior muestra "Estados Unidos". – Dono

+0

*** No igual *** 'Panel de control: opciones regionales y de idioma-> Estándares y formatos 'que' Panel de control: opciones regionales y de idioma-> Ubicación' – Kiquenet

17

Después de mucho googlear, finalmente recibí la respuesta. Después de dos enlaces ayudarme a conseguir la máquina actual ubicación,

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

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

hice la siguiente clase de utilidad si alguien está interesado en código- última

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

Esta es la ÚNICA solución de trabajo en varios sistemas operativos, como Win7 + Win8. No entiendo por qué no está calificado en absoluto ... – Raffaeu

+0

'using (var regKeyGeo = Microsoft.Win32.Registry.CurrentUser.OpenSubKey (@" Panel de control \ International \ Geo ")) { Response.Write ("
Geo Nation "+ regKeyGeo.GetValue (" Nation "). ToString()); } ' – Kiquenet

+0

@Kiquenet Usar el registro es algo que definitivamente evitaría. Generalmente no está documentado ni respaldado, y puedes estar bastante seguro de que se romperá en algún momento. – Poorkenny

0

Base en "Control Panel> Región> Ubicación de inicio ", puede obtener RegionInfo. Pruebe esto -

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