【问题标题】:NSIS Detect Windows VersionNSIS 检测 Windows 版本
【发布时间】:2013-01-19 00:25:52
【问题描述】:

在 NSIS 中有没有一种方法可以确定用户当前运行的 Windows 版本是什么?

我想要这样做的原因是因为我的安装程序在 Windows XP 计算机上看起来不同。我的安装程序使用 MUI2,但我似乎没有与 Windows 7 中相同的 GUI 按钮(我认为它称为 XP 样式),并且主安装程序窗口比 Windows 7 中的大得多(大约 500 x 400 像素)。 在使用 MUI2 的安装程序中存在这些差异是否正常? 我认为 MUI2 在 Windows XP 及更高版本中使外观保持一致?

为了克服安装程序窗口大小的差异,我的解决方案是检测用户是否使用 Windows XP 并相应地调整窗口大小。这可能吗?

我需要有一个特定大小的窗口,因为我有一个背景图像并且图像是 500 像素宽,所以如果安装程序窗口更大,我会有一个空白间隙。我可以将背景图像更改为更宽,但对我自己来说最简单的解决方案是我上面解释的那个

【问题讨论】:

  • 也许张贴 XP 和 7 的屏幕截图,以便我们看看你在说什么?

标签: installation nsis


【解决方案1】:

如果Anders' answer 不够明确(我花了几个小时才弄好),这里有一个更“适合初学者”的版本。

您需要将!include WinVer.nsh 添加到 cd.nsi 文件的顶部。

然后你可以使用这样的代码:

${If} ${IsWinXP}
     MessageBox MB_OK|MB_ICONEXCLAMATION "We have Win XP"
${EndIf}

这是我测试的唯一一个功能,但是 WinVer.nsh 文件以一个迷你手册开头,其功能包括:

  • AtLeastWin<version> 检查安装程序是否至少在指定的 Windows 版本上运行。
  • IsWin<version> 检查安装程序是否完全按照指定在 Windows 版本上运行。
  • AtMostWin<version> 检查安装程序是否最多在指定的 Windows 版本上运行。

<version> 可以替换为以下值(可能更多,取决于您的 WinVer.nsh 文件的最新程度):95、98、ME、NT4、2000、 XP、2003、Vista、2008、7、2008R2

WinVer.nsh 文件中还有一些函数和一些使用示例,可​​能位于C:\Program Files\NSIS\Include 之类的地方,例如:

  • AtLeastServicePack 检查安装程序是否至少在指定的 Windows 服务包版本上运行。
  • IsServicePack 检查安装程序是否完全按照指定在 Windows 服务包版本上运行。
  • AtMostServicePack 检查安装程序是否最多在指定的 Windows 服务版本包上运行。
  • IsWin2003R2(未提供更多详细信息)
  • IsStarterEdition(未提供更多详细信息)
  • OSHasMediaCenter(未提供更多详细信息)
  • OSHasTabletSupport(未提供更多详细信息)

【讨论】:

  • 注:根据nsis.sourceforge.net/Get_Windows_version 页面,WinVer.nsh 已经过时了。最好添加GetWindowsVersion 函数,即further down the page。这已扩展为与 Windows 10 / Server 2016 匹配。只需将脚本复制并粘贴到 .nsi 文件的顶部即可。然后您可以通过${GetWindowsVersion} $R0、StrCmp $R0 "10.0" win10 not_win10 比较输出(如果您已经完成升级,您还可以在期望 Windows 10 时获得 Windows 7 / 8.1)。
【解决方案2】:

MUI 不会根据 Windows 版本调整窗口大小。然而,窗口大小受字体和 DPI 设置的影响。

使用WinVer.nsh 检测 Windows 版本。该模块默认包含在 NSIS 的包含文件夹中。

【讨论】:

    【解决方案3】:

    下面的 sn-p 显示了如何识别 Windows 版本,其中包含我能想象到的有用的详细信息:

    !include WinVer.nsh
    !include "LogicLib.nsh"
    
    Function LogWinVer
    
        ${WinVerGetMajor} $R0
        ${WinVerGetMinor} $R1
        ${WinVerGetBuild} $R2
        ${WinVerGetServicePackLevel} $R3
    
        ; determine windows product name
        ${If} $R0 == 5 
                ${If} $R1 == 0
                        DetailPrint "Windows 2000 SP $R3"
                ${ElseIf} $R1 == 1
                        DetailPrint "Windows XP SP $R3"
                ${ElseIf} $R1 == 2
                        DetailPrint "Windows Server 2003 SP $R3"
                ${EndIf}
        ${ElseIf} $R0 == 6
                ${If} $R1 == 0
                        ${If} ${IsServerOS}
                                DetailPrint "Windows Server 2008 SP $R3"
                        ${Else}
                                DetailPrint "Windows Vista SP $R3"
                        ${EndIf}
                ${ElseIf} $R1 == 1
                        ${If} ${IsServerOS}
                                DetailPrint "Windows Server 2008 R2 SP $R3"
                        ${Else}
                                DetailPrint "Windows 7 SP $R3"
                        ${EndIf}
                ${ElseIf} $R1 == 2
                        ${If} ${IsServerOS} 
                                DetailPrint "Windows Server 2012 SP $R3"
                        ${Else}
                                DetailPrint "Windows 8 SP $R3"
                        ${EndIf}
                ${ElseIf} $R1 == 3
                        ${If} ${IsServerOS}
                                DetailPrint "Windows Server 2012 R2 SP $R3"
                        ${Else}
                                DetailPrint "Windows 8.1 SP $R3"
                        ${EndIf}
                ${EndIf}
        ${EndIf}
    
        ; version
        DetailPrint "Kernel $R0.$R1 build $R2"
    
    
        ; x86 or x64:
        Call LogWinVer
        System::Call "kernel32::GetCurrentProcess() i .s"
        System::Call "kernel32::IsWow64Process(i s, *i .r0)"
        StrCmp $0 "0" is32bit is64bit
    
        is32bit:
                DetailPrint "32 bit"
                Goto exit
        is64bit:
                DetailPrint "64 bit"
        exit:
    FunctionEnd
    

    【讨论】:

      【解决方案4】:

      您也可以直接从注册表中读取:

      ReadRegStr $WinEdition HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" "ProductName"
      

      接下来可以用“==”进行比较,例如:

      ${If} $WinEdition == "Windows XP"
      

      或者你可以使用StrContains来检查windows版本是否包含“Windows XP”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-18
        • 1970-01-01
        • 2012-10-25
        • 2016-03-17
        • 1970-01-01
        相关资源
        最近更新 更多