2012-01-16 29 views
7

Làm cách nào để có được vị trí hiện tại của máy như được chỉ định trong Khu vực và Ngôn ngữ của Hệ điều hành? Tôi đã cố gắng nhận được điều này từ lớp RegionInfo nhưng nó trả về Vị trí như được chỉ định trong trình đơn thả xuống Định dạng của Vùng và Ngôn ngữ.Lấy Vị trí Hiện tại (như được chỉ định trong Khu vực và Ngôn ngữ) trong C#

Chỉ cần làm rõ ý tôi là gì, Nếu bạn mở Vùng và ngôn ngữ từ Pa-nen điều khiển của máy, tôi muốn đọc Vị trí như được chỉ định trong tab Vị trí. RegionInfo cung cấp cho tôi giá trị như được chỉ định trong menu thả xuống Định dạng của tab Định dạng.

+3

@Sai Tôi nghĩ OP có nghĩa là vị trí địa lý. – Glenn

+0

Tôi nghĩ rằng anh ấy muốn Vị trí như trong * Ukraina, Hoa Kỳ, Vương quốc Anh * như khôn ngoan và không liên quan gì đến văn hóa – V4Vendetta

+0

Điều đó là chính xác. Ví dụ, tôi có thể có văn hóa của tôi như tiếng Anh (Hoa Kỳ) và vị trí của tôi là Ấn Độ. Bạn có thể thay đổi cả hai điều này một cách độc lập trong bảng điều khiển Vùng và Ngôn ngữ. –

Trả lời

2

yes .. nhưng dễ dàng hơn:

CultureInfo info = CultureInfo.CurrentCulture; 
+0

Điều đó không có tác dụng. Ví dụ: tab Vị trí của tôi được đặt thành Nhật Bản. Tuy nhiên, mã trên đã tạo ra en-US. – Dono

+0

*** Không giống *** 'Bảng điều khiển: Tùy chọn vùng và ngôn ngữ-> Tiêu chuẩn và định dạng' hơn' Bảng điều khiển: Tùy chọn khu vực và ngôn ngữ-> Vị trí ' – Kiquenet

1

Bạn có thể thử sử dụng

RegionInfo.CurrentRegion.DisplayName;

Điều này cung cấp cho bạn tên Location yêu cầu như bạn có ý định

+0

Tôi đã thử điều này nhưng nó cung cấp cho tôi Định dạng hiện tại chứ không phải vị trí hiện tại như được chỉ định trong hộp thoại Khu vực và Ngôn ngữ (Bảng điều khiển -> Khu vực và Ngôn ngữ) –

+0

Sẽ không hoạt động. Vị trí của tôi là Nhật Bản, nhưng ở trên cho thấy "Hoa Kỳ". – Dono

+0

*** Không giống *** 'Bảng điều khiển: Tùy chọn vùng và ngôn ngữ-> Tiêu chuẩn và định dạng' hơn' Bảng điều khiển: Tùy chọn vùng và ngôn ngữ-> Vị trí' – Kiquenet

17

Sau rất nhiều googling, cuối cùng tôi đã nhận được câu trả lời. Sau hai liên kết giúp tôi có được máy hiện Location-

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

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

tôi làm lớp tiện ích sau đây nếu ai quan tâm đến việc số- thức

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

Đây là giải pháp làm việc CHỈ trên nhiều hệ điều hành, như Win7 + Win8. Tôi không hiểu tại sao không được xếp hạng ... – Raffaeu

+0

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

+0

@Kiquenet Sử dụng đăng ký là điều tôi chắc chắn sẽ tránh. Đó là nói chung không có giấy tờ và không được hỗ trợ, và bạn có thể khá chắc chắn rằng nó sẽ phá vỡ tại một số điểm. – Poorkenny

0

Căn cứ vào "Control Panel> Region> Home Location ", bạn có thể lấy RegionInfo. Hãy thử điều này -

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)); 
Các vấn đề liên quan