用户尝试在不受支持的操作系统上安装时如何显示弹出消息

时间:2019-03-17 16:20:49

标签: nsis

在安装软件时,我想检测操作系统,如果它是“ Windows 10 Pro”或“ Windows Server 2012”,则应弹出一个消息框,并应停止安装。

我正在使用下面的代码段。但是,即使操作系统是“ Windows 10 Pro”,此处也不会弹出消息框。

public static void createSnackbar(Context context, Integer snackbarLength, String textMessage,
                                      CoordinatorLayout coordinatorLayout) {

    Snackbar snackbar = Snackbar.make(coordinatorLayout, textMessage, snackbarLength);

    View snackBarView = snackbar.getView();
    CoordinatorLayout.LayoutParams params=(CoordinatorLayout.LayoutParams) snackBarView.getLayoutParams();
    params.gravity = Gravity.TOP;
    snackBarView.setLayoutParams(params);

    int snackbarTextId = android.support.design.R.id.snackbar_text;
    TextView textView = snackBarView.findViewById(snackbarTextId);
    textView.setTextColor(context.getResources().getColor(R.color.red_dark));

    snackBarView.setBackgroundColor(context.getResources().getColor(R.color.colorWood));
    snackbar.show();
}

是正确的方法还是有什么方法可以检测到操作系统并显示消息框?

1 个答案:

答案 0 :(得分:0)

我不太了解为什么需要这些限制,但是您可以:

!include WinVer.nsh

!define /IfNDef PRODUCT_PROFESSIONAL      0x00000030
!define /IfNDef PRODUCT_PROFESSIONAL_N    0x00000031
!define /IfNDef PRODUCT_PRO_WORKSTATION   0x000000A1
!define /IfNDef PRODUCT_PRO_WORKSTATION_N 0x000000A2
!define /IfNDef ERROR_INSTALL_REJECTED 1654

Function .onInit
System::Call 'KERNEL32::GetProductInfo(i6,i1,i0,i0,*i0r1)'
${WinVerGetBuild} $2

${If} ${IsServerOS} ; Windows Server?
${AndIf} $2 U>= 9200 ; Server 2012?
${AndIf} $2 U<  9600 ; and not Server 2012 R2?
    Goto die_unsupported_os
${EndIf}

${If} $2 U>= 9800 ; Windows 10?
${AndIfNot} ${IsServerOS} ; Not Windows Server?
    ${If} $1 = ${PRODUCT_PROFESSIONAL}
    ${OrIf} $1 = ${PRODUCT_PROFESSIONAL_N}
    ${OrIf} $1 = ${PRODUCT_PRO_WORKSTATION}
    ${OrIf} $1 = ${PRODUCT_PRO_WORKSTATION_N}
        die_unsupported_os:
        MessageBox mb_IconStop|mb_OK "Not allowed to run on this version of Windows for some reason!" /SD IDOK
        SetErrorLevel ${ERROR_INSTALL_REJECTED}
        Quit
    ${EndIf}
${EndIf}
FunctionEnd

注意:Windows Insider内部版本也被标识为Pro,因此您最终也会阻止它们。