2012-01-16 7 views
7

Come posso ottenere la posizione corrente della macchina come specificato in Regione e Lingua del sistema operativo? Ho già provato a ottenere questo dalla classe RegionInfo ma restituisce la posizione come specificato nella casella di riepilogo Formato di Regione e Lingua.Ottieni posizione corrente (come specificato in Regione e Lingua) in C#

Giusto per chiarire cosa intendo, se si apre Regione e lingua dal Pannello di controllo della macchina, voglio leggere Posizione come specificato nella scheda Posizione. RegionInfo mi dà valore come specificato nella scheda Formato della scheda Formati.

+3

@Sai Penso che l'OP indichi la posizione geografica. – Glenn

+0

Penso che voglia Location come in * Ucraina, Stati Uniti, Regno Unito * come saggio e niente a che fare con la cultura – V4Vendetta

+0

Che è corretto. Ad esempio, posso avere la mia cultura come inglese (Stati Uniti) e la mia posizione come India. È possibile cambiarli entrambi in modo indipendente nel pannello di controllo della regione e della lingua. –

risposta

2

sì .. ma più facile:

CultureInfo info = CultureInfo.CurrentCulture; 
+0

Questo non funziona. Ad esempio, la mia scheda Posizione è impostata su Giappone. Tuttavia, il codice sopra generato ha generato en-US. – Dono

+0

*** Non uguale *** 'Pannello di controllo: Opzioni internazionali e della lingua-> Standard e formati' di' Pannello di controllo: Opzioni internazionali e lingua-> Posizione' – Kiquenet

1

Puoi provare a utilizzare

RegionInfo.CurrentRegion.DisplayName;

Questo le dà il nome della località desiderata come si intende

+0

Ho provato questo ma mi dà il formato attuale e non il posizione corrente come specificato nella finestra di dialogo Regione e Lingua (Pannello di controllo -> Regione e lingua) –

+0

Non funziona. La mia posizione è il Giappone, ma la precedente mostra "Stati Uniti". – Dono

+0

*** Non uguale *** 'Pannello di controllo: Opzioni internazionali e della lingua-> Standard e formati' di' Pannello di controllo: Opzioni internazionali e della lingua-> Posizione' – Kiquenet

17

Dopo sacco di googling, finalmente ho la risposta. A seguito di due collegamenti aiutarmi a ottenere la macchina corrente posizione-

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

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

ho fatto la seguente classe di utilità, se qualcuno è interessato a code-finale

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

Questa è l'UNICA soluzione funzionante su più SO, come Win7 + Win8. Non capisco perché non è valutato per nulla ... – Raffaeu

+0

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

+0

@Kiquenet L'utilizzo del registro è qualcosa che eviterei sicuramente. Questo è generalmente non documentato e non supportato, e puoi essere abbastanza sicuro che si romperà ad un certo punto. – Poorkenny

0

Base sul "Controllo Pannello> Regione> Posizione iniziale ", puoi ottenere RegionInfo. Prova questo -

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