在NSIS中有一种方法可以确定用户当前正在运行的Windows版本吗?
我想这样做的原因是因为我的安装程序在Windows XP计算机上看起来不同。我的安装程序使用MUI2,但我似乎没有像在Windows 7中那样使用相同的GUI按钮(我认为它称为XP风格),主安装程序窗口比Windows 7(大约500 x 400像素)大得多。 使用MUI2在安装程序中存在这些差异是否正常? 我认为MUI2在Windows XP及更高版本中看起来一致吗?
为了克服安装程序窗口大小的差异,我的解决方案是检测用户是否使用Windows XP并相应地调整窗口大小。这可能吗?
我需要让窗口具有特定的大小,因为我有一个背景图像,图像宽度为500px,所以如果安装程序窗口较大,我会有一个空白。我可以将背景图像更改为更宽,但对我来说最简单的解决方案是我上面解释的那个
答案 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文件的最近状态):95
,98
,ME
, NT4
,2000
,XP
,2003
,Vista
,2008
,7
,2008R2
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”