2012-01-16 44 views
7

如何獲取機器的當前位置,如在OS的區域和語言中指定的?我已經嘗試從RegionInfo類中得到這個,但它返回Location(區域和語言)格式下拉菜單中指定的位置。在C#中獲取當前位置(在區域和語言中指定)

只是爲了闡明我的意思,如果您從機器的控制面板打開區域和語言,我想按位置選項卡中指定的方式讀取位置。 RegionInfo給出了「格式」選項卡的「格式」下拉列表中指定的值。

+3

@Sai我認爲OP是指地理位置。 – Glenn 2012-01-16 11:30:53

+0

我認爲他希望位置在*烏克蘭,美國,英國*像智慧和文化無關 – V4Vendetta 2012-01-16 11:58:46

+0

這是正確的。例如,我的文化可以是英語(美國),我的位置可以是印度。您可以在區域和語言控制面板中單獨更改這兩個選項。 – 2012-01-16 13:15:33

回答

2

是的..但容易:

CultureInfo info = CultureInfo.CurrentCulture; 
+0

這不起作用。例如,我的位置標籤設置爲日本。但是,上面的代碼生成en-US。 – Dono 2012-01-16 13:45:55

+0

***不一樣***'控制面板:區域和語言選項 - >標準和格式'比'控制面板:區域和語言選項 - >位置' – Kiquenet 2015-12-21 14:56:24

1

你可以嘗試使用

RegionInfo.CurrentRegion.DisplayName;

這是否給你所需要的地點的名稱與您打算

+0

我試過這個,但它給了我目前的格式,而不是在「區域和語言」對話框中指定的當前位置(控制面板 - >區域和語言) – 2012-01-16 13:12:15

+0

不起作用。我的位置是日本,但上面顯示「美國」。 – Dono 2012-01-16 13:47:31

+0

***不一樣***'控制面板:區域和語言選項 - >標準和格式'比控制面板:區域和語言選項 - >位置' – Kiquenet 2015-12-22 06:38:50

17

很多谷歌上搜索後,最後我得到了答案。以下兩個鏈接幫我把當前的機器位置 -

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 2013-02-07 15:40:32

+0

'使用(var regKeyGeo = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@「Control Panel \ International \ Geo」)) { Response.Write(「
Geo Nation「+ regKeyGeo.GetValue(」Nation「)。ToString()); }' – Kiquenet 2015-12-21 14:58:34

+0

@Kiquenet使用註冊表是我絕對避免的。這通常是沒有文檔和不受支持的,你可以確信它會在某個時候破裂。 – Poorkenny 2016-06-08 10:21:18

0

基地面板>地區>家庭地點「,你可以得到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)); 
相關問題