8

在 NSIS 中有没有办法确定用户当前正在运行什么版本的 Windows?

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

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

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

4

4 回答 4

8

如果安德斯的回答不够明确(我花了几个小时才把它弄好),这里有一个更“初学者友好”的版本。

您将需要添加!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(没有提供更多细节)
于 2014-06-02T12:23:40.463 回答
6

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

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

于 2013-01-19T10:16:26.247 回答
1

You could also read from the registry directly:

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

Next, you can compare it using "==", for example:

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

or you could use StrContains to check if the windows version contains "Windows XP"

于 2014-09-01T10:51:32.603 回答
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
于 2014-07-15T14:26:33.237 回答