10

我正在寻找在 C# 中检索机器的 Windows 体验评级。如果可能的话,我还想检索每个组件(图形、RAM 等)的数字。

这可能吗?

4

3 回答 3

7

每次用户通过控制面板计算 Windows 体验评级时,系统都会在%Windows%\Performance\WinSAT\DataStore\

您需要查找最新的文件(它们首先以最重要的日期命名,因此查找最新的文件很简单)。

这些文件是 xml 文件,很容易用 XmlReader 或其他 xml 解析器解析。

您感兴趣的部分是WinSAT\WinSPR并且包含单个部分中的所有分数。例如

<WinSAT>
    <WinSPR>
        <SystemScore>3.7</SystemScore> 
        <MemoryScore>5.9</MemoryScore> 
        <CpuScore>5.2</CpuScore> 
        <CPUSubAggScore>5.1</CPUSubAggScore> 
        <VideoEncodeScore>5.3</VideoEncodeScore> 
        <GraphicsScore>3.9</GraphicsScore> 
        <GamingScore>3.7</GamingScore> 
        <DiskScore>5.2</DiskScore> 
    </WinSPR>
...
于 2009-01-26T11:46:28.977 回答
4

与 LINQ 相同:

var dirName = Environment.ExpandEnvironmentVariables(@"%WinDir%\Performance\WinSAT\DataStore\");
var dirInfo = new DirectoryInfo(dirName);
var file = dirInfo.EnumerateFileSystemInfos("*Formal.Assessment*.xml")
    .OrderByDescending(fi => fi.LastWriteTime)
    .FirstOrDefault();

if (file == null)
    throw new FileNotFoundException("WEI assessment xml not found");

var doc = XDocument.Load(file.FullName);

Console.WriteLine("Processor: " + doc.Descendants("CpuScore").First().Value);
Console.WriteLine("Memory (RAM): " + doc.Descendants("MemoryScore").First().Value);
Console.WriteLine("Graphics: " + doc.Descendants("GraphicsScore").First().Value);
Console.WriteLine("Gaming graphics: " + doc.Descendants("GamingScore").First().Value);
Console.WriteLine("Primary hard disk: " + doc.Descendants("DiskScore").First().Value);
Console.WriteLine("Base score: " + doc.Descendants("SystemScore").First().Value);
于 2012-03-27T09:13:49.763 回答
1

是 VB.NET 的一个片段。转换为 C#(使用this,我还没有实际测试过代码,虽然它看起来很好)。

/// <summary>
/// Gets the base score of a computer running Windows Vista or higher.
/// </summary>
/// <returns>The String Representation of Score, or False.</returns>
/// <remarks></remarks>
public string GetBaseScore()
{
    // Check if the computer has a \WinSAT dir.
    if (System.IO.Directory.Exists("C:\\Windows\\Performance\\WinSAT\\DataStore"))
    { 
        // Our method to get the most recently updated score.
        // Because the program makes a new XML file on every update of the score,
        // we need to calculate the most recent, just incase the owner has upgraded.
        System.IO.DirectoryInfo Dir = new System.IO.DirectoryInfo("C:\\Windows\\Performance\\WinSAT\\DataStore");
        System.IO.FileInfo[] fileDir = null;
        System.IO.FileInfo fileMostRecent = default(IO.FileInfo);
        System.DateTime LastAccessTime = default(System.DateTime);
        string LastAccessPath = string.Empty;
        fileDir = Dir.GetFiles;

        // Loop through the files in the \WinSAT dir to find the newest one.
        foreach (var fileMostRecent in fileDir)
        {
            if (fileMostRecent.LastAccessTime >= LastAccessTime)
            {
                LastAccessTime = fileMostRecent.LastAccessTime;
                LastAccessPath = fileMostRecent.FullName;
            }
        }

        // Create an XmlTextReader instance.
        System.Xml.XmlTextReader xmlReadScore = new System.Xml.XmlTextReader(LastAccessPath);

        // Disable whitespace handling so we don't read over them
        xmlReadScore.WhitespaceHandling = System.Xml.WhitespaceHandling.None;

        // We need to get to the 25th tag, "WinSPR".
        for (int i = 0; i <= 26; i++)
        {
            xmlReadScore.Read();
        }

        // Create a string variable, so we can clean up without any mishaps.
        string SystemScore = xmlReadScore.ReadElementString("SystemScore");

        // Clean up.
        xmlReadScore.Close();

        return SystemScore;
    }

    // Unsuccessful.
    return false;
}

我想它只会返回总体评分,但希望它至少能让你开始。可能只需要更改文件名/参数即可获得单独的评级。

于 2009-01-26T11:10:32.920 回答