如何获得作为GetVersion / GetVersionEx Win8.1的操作系统版本已被弃用?

我有我想具体知道操作系统的主要/次要版本和内部编号等情况

Windows 8.1开始, GetVersionGetVersionEx已被弃用,指出:

在Windows 8.1之后, GetVersion / GetVersionEx可能会被更改或不可用。 相反,使用版本助手function]

版本帮助器API没有帮助我获得操作系统版本号,而是帮助我validation或了解我的版本是否相同或高于某些提到的版本。 可以做什么?

有一个名为GetProductInfo的新函数返回版本信息。

如果你想测试一个特定的版本,你甚至应该使用VerifyVersionInfo

创建一个结构来检查特定的操作系统版本是否正在运行很容易。 VerifyVersionInfo使用版本结构,您可以轻松检查VER_GREATER_EQUAL和VER_LESS_EQUAL

另外请注意,如果您在清单的兼容性部分中定义了正确的受支持的操作系统条目,则GetVersionEx不会位于Windows 8.1系统上。 但它可能在于未来的操作系统版本!

API GetVersionEx()继续在Windows 8.1+中工作,但是Microsoft已经改变了它的功能。 来自MSDN(强调我的):

随着Windows 8.1的发布,GetVersionEx API的行为在操作系统版本的返回值中发生了变化。 GetVersionEx函数返回的值现在取决于应用程序的表现方式

不会在Windows 8.1中显示的应用程序将返回Windows 8操作系统版本值(6.2)。 一旦某个应用程序出现在给定的操作系统版本中,GetVersionEx将始终返回该应用程序在未来发行版中的版本。 要为Windows 8.1显示您的应用程序,请参阅针对Windows 8.1的应用程序。

您需要做的是将适当的GUID添加到您的应用程序(.exe / .dll)二进制文件(通过清单XML信息)。 换句话说, 如果您明确指出您的应用程序支持8.1,则在Windows 8.1上运行时,GetVersionEx()将返回适当的信息 。 如果你不这样做,GetVersionEx()会骗你。

请参阅定位您的应用程序对于Windows 8.1以获取GUID列表。 这里也覆盖 。

GUID懒惰列表

  • Vista: {e2011457-1546-43c5-a5fe-008deee3d3f0}
  • Windows 7: {35138b9a-5d96-4fbd-8e2d-a2440225f93a}
  • Windows 8: {4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}
  • Windows 8.1: {1f676c76-80e1-4239-95bb-83d0f6d0da78}
  • Windows 10: {8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}

在codeproject.com上查看这篇文章 ,它对于Windows 8来说是完美的:

1)下载.DLL并将其添加到您的项目。

2)使用此代码获取操作系统信息

 StringBuilder sb = new StringBuilder(String.Empty); sb.AppendLine("Operation System Information"); sb.AppendLine("----------------------------"); sb.AppendLine(String.Format("Name = {0}", OSVersionInfo.Name)); sb.AppendLine(String.Format("Edition = {0}", OSVersionInfo.Edition)); if (OSVersionInfo.ServicePack!=string.Empty) sb.AppendLine(String.Format("Service Pack = {0}", OSVersionInfo.ServicePack)); else sb.AppendLine("Service Pack = None"); sb.AppendLine(String.Format("Version = {0}", OSVersionInfo.VersionString)); sb.AppendLine(String.Format("ProcessorBits = {0}", OSVersionInfo.ProcessorBits)); sb.AppendLine(String.Format("OSBits = {0}", OSVersionInfo.OSBits)); sb.AppendLine(String.Format("ProgramBits = {0}", OSVersionInfo.ProgramBits)); textBox1.Text = sb.ToString();