2015-08-03 26 views
6

Używam Windows 10 10240 Univasal aplikacji Windows, gdy używam Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamilyVersion, aby uzyskać wersję deivce, zwraca ciąg "2814750438211605" zamiast formatu wersji (major.minor.revision.build). Ktoś może mi powiedzieć, co oznacza ciąg "2814750438211605"?Windows 10 get DeviceFamilyVersion

+0

Czy otrzymujesz taki sam wynik, jeśli używasz 'Windows.System.Profile.AnalyticsInfo.AnalyticsVersionInfo.DeviceFamilyVersion'? – Herdo

+4

Jest tam, zamień go na hex. 2814750438211605 == 0x000A000028004015 == 10.0.10240.16405. Numer wersji Win10. –

+0

@HansPassant to świetnie, dziękuję bardzo! – tao

Odpowiedz

3

Aplikacja powinna traktować te dane jako nieprzezroczyste i wystarczy zalogować że „tak jak jest”. Jest to 64-bitowa wartość dziesiętna jako ciąg.

Pamiętaj intencję tego API jest zapewnienie ciąg dziennika, z których można zrekonstruować numer wersji OS wsparcia/Analytics. Na swojej analizie po stronie serwera, można go przekształcić w razie potrzeby lub po prostu użyć go jako unikalny identyfikator wersji ... Jeśli rzeczywiście próbuje zanalizować to wykonywania, następnie używasz go nieprawidłowo i całkiem prawdopodobne, aby odtworzyć te same problemy, które spowodowało GetVersionEx i VerifyVersionInfo wycofywana w pierwszej kolejności.

Nie analizowania łańcuch w czasie wykonywania w aplikacji. Wystarczy przechowywać „jak jest” Pamiętaj, że w systemie Windows 10, klient naprawdę nie ma pojęcia, o co ci chodzi, jeśli zapytać „Co wersja systemu Windows masz?”. Odpowiedź brzmi "10" i najprawdopodobniej nadal będzie "10" przez długi czas.

+0

To bardzo mało, aby pomóc w rozwiązywaniu problemów z pola. Jeśli chcesz uzyskać pełne DFV zalogowane w analitykach do debugowania jakichkolwiek problemów, musisz przejść przez wspomnianą wyżej trasę Martin. – bc3tech

+0

To, czego naprawdę potrzebujesz, to zrzuty po awarii, tak? Możesz je dostać przez portal. –

+0

niekoniecznie. Każde logowanie, naprawdę. okna dialogowe "Wyślij raport" i wiadomości e-mail ... itd. – bc3tech

15

Wartość wersji systemu operacyjnego Windows 10 znajduje się w tej właściwości łańcucha:
Windows.System.Profile. AnalyticsInfo.VersionInfo.DeviceFamilyVersion

Zwraca wartość ciągu, np. "2814750438211613".
Aby przekonwertować ten długi numer do czytelnego formatu użytku to:

string sv = AnalyticsInfo.VersionInfo.DeviceFamilyVersion; 
ulong v = ulong.Parse(sv); 
ulong v1 = (v & 0xFFFF000000000000L) >> 48; 
ulong v2 = (v & 0x0000FFFF00000000L) >> 32; 
ulong v3 = (v & 0x00000000FFFF0000L) >> 16; 
ulong v4 = v & 0x000000000000FFFFL; 
string version = $"{v1}.{v2}.{v3}.{v4}"; // == 10.0.10240.16413 
+0

dziękuję, działa, ale jakoś nie wiem, dlaczego to nie działa w javascript .... Mam nadzieję, że ktoś może mi odpowiedzieć później .. daje mi 0 w pierwszej cyfrze. wersja var = 2814750438211613, V1 = (wersja i 0xFFFF000000000000) >> 48 V2 = (wersja i 0x0000FFFF00000000) >> 32 v3 = (wersja i 0x00000000FFFF0000) >> 16 V4 = wersja i 0x000000000000FFFF; Pierwszy z nich będzie niepoprawny i da 0 zamiast 10. –

0

Tylko fajną sposób to zrobić .. I Creadted enum, który jest używany w celu dopasowania predefiniowanych rodziny urządzeń

public enum DeviceFamily 
{ 
    Unknown, 
    Desktop, 
    Tablet, 
    Mobile, 
    SurfaceHub, 
    Xbox, 
    Iot 
} 

Ta metoda sprawdzi i przetworzy go w enum.

var q = ResourceContext.GetForCurrentView().QualifierValues; 
    if (q.ContainsKey("DeviceFamily")) 
    { 
     try 
     { 
      Enum.Parse(typeof(DeviceFamily) , q["DeviceFamily"]); 
      //send the user notification about the device family he is in. 
     } 
     catch (Exception ex) { } 
    } 
2

Jeśli znalazłeś to pytanie i polubiłeś mnie, szukając sposobu na to w JavaScript, może ci się przydać.

getDeviceFamilyVersion() { 
    let deviceFamilyVersion = Windows.System.Profile.AnalyticsInfo.versionInfo.deviceFamilyVersion; 
    let deviceFamilyVersionDecimalFormat = parseInt(deviceFamilyVersion); 

    if (isNaN(deviceFamilyVersionDecimalFormat)) { 
     throw new Error('cannot parse device family version number'); 
    } 

    let hexString = deviceFamilyVersionDecimalFormat.toString(16).toUpperCase(); 

    while (hexString.length !== 16) { // this is needed because JavaScript trims the leading zeros when converting to hex string 
     hexString = '0' + hexString; 
    } 

    let hexStringIterator = 0; 
    let versionString = ''; 
    while (hexStringIterator < hexString.length) { 
     let subHexString = hexString.substring(hexStringIterator, hexStringIterator + 4); 
     let decimalValue = parseInt(subHexString, 16); 

     versionString += decimalValue + '.'; 
     hexStringIterator += 4; 
    } 

    return versionString.substring(0, versionString.length - 1); 
} 
Powiązane problemy