NSIS检测Windows版本

时间:2013-01-19 00:25:52

标签: installer nsis

在NSIS中有一种方法可以确定用户当前正在运行的Windows版本吗?

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

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

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

4 个答案:

答案 0 :(得分:7)

如果Anders' answer不够明确(花了我几个小时才能做到这一点),这里有一个更开心的“#34}友好的"版本

您需要将!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文件的最近状态):9598MENT42000XP2003Vista200872008R2

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

  • AtLeastServicePack,它至少按照指定检查安装程序是否在Windows Service Pack版本上运行。
  • IsServicePack,用于检查安装程序是否完全按照指定在Windows Service Pack版本上运行。
  • AtMostServicePack,用于检查安装程序是否在指定的Windows服务版本包上运行。
  • IsWin2003R2(不再提供详情)
  • IsStarterEdition(不再提供详情)
  • OSHasMediaCenter(不再提供详情)
  • OSHasTabletSupport(不再提供详情)

答案 1 :(得分:5)

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

使用WinVer.nsh检测Windows版本。默认情况下,此模块包含在NSIS包含文件夹中。

答案 2 :(得分:1)

下面的代码段显示了如何使用我想象的有用的详细信息识别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

答案 3 :(得分:1)

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

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

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

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

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