【问题标题】:How to hide or disable Cancel button in WIX Installer?如何隐藏或禁用 WIX 安装程序中的取消按钮?
【发布时间】:2018-08-17 10:34:21
【问题描述】:

我是 WiX 安装程序的新手。当进度条运行时,我需要在 WIX 安装程序中隐藏禁用取消按钮

我已经用谷歌搜索但没有找到一些有用的链接来隐藏取消按钮。我发现了这个:Hiding the Cancel Button During an Installation,但仍然不知道如何使用自定义操作。有没有人可以给我一些指导来实现这一点?

我做了以下事情来隐藏取消按钮,但它不起作用。 首先,我根据上面提到的链接用 C++ 编写了一个自定义操作。让我展示一下我为自定义操作做了什么。

打开 Visual Studio -> 创建新项目 -> 选择 C++ 中的自定义操作并选择类型 DLL。

它将使用 cpp 文件创建一个新项目。我将 cpp 文件命名为自定义操作并编写以下代码:

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <Shellapi.h>
#include <msi.h>
#include <Msiquery.h>


UINT __stdcall HideCancelButton(MSIHANDLE hInstall)
{
    PMSIHANDLE hRecord = MsiCreateRecord(2);
    if (!hRecord)
        return ERROR_INSTALL_FAILURE;

    if (ERROR_SUCCESS != MsiRecordSetInteger(hRecord, 1, 2)
        || ERROR_SUCCESS != MsiRecordSetInteger(hRecord, 2, 0))
        return ERROR_INSTALL_FAILURE;

    MsiProcessMessage(hInstall, INSTALLMESSAGE_COMMONDATA, hRecord);

    return ERROR_SUCCESS;
}


// DllMain - Initialize and cleanup WiX custom action utils.
extern "C" BOOL WINAPI DllMain(
    __in HINSTANCE hInst,
    __in ULONG ulReason,
    __in LPVOID
    )
{
    switch(ulReason)
    {
    case DLL_PROCESS_ATTACH:
        WcaGlobalInitialize(hInst);
        break;

    case DLL_PROCESS_DETACH:
        WcaGlobalFinalize();
        break;
    }

    return TRUE;
}

这是.def文件代码:

LIBRARY "HideCancelButton"

EXPORTS
    HideCancelButton

现在我构建项目并创建了 HideCancelButton.dll 文件。

现在来看我的 WIX 项目。 添加自定义操作:

 <Binary Id="HideCancelButtonDll" SourceFile="C:\Users\umer\Desktop\HideCancelButton.dll"/>
    <CustomAction Id="CAhidecancel" BinaryKey="HideCancelButtonDll" Execute="immediate" Impersonate="no" DllEntry="HideCancelButton" Return="check"/>

在安装执行序列中添加以下行

 <Custom Action='CAhidecancel' Before='CreateSSISCatalog'></Custom>

这就是我所做的一切,但它不起作用。我检查了日志,它显示返回值为 1。但仍然显示取消按钮。要检查函数是否正在调用,我在安装程序上放置了 sleep(10000) 并显示状态,它按预期工作,但显示取消按钮。

【问题讨论】:

    标签: c++ wix custom-action windows-installer


    【解决方案1】:

    隐藏取消按钮

    您找到的链接是目前能找到的最权威的链接。它说明了一切,但让我在这里为任何发现此问题的用户总结一下。

    在这样做之前,我们必须问你为什么需要这个?它可能表示应该以其他方式解决的问题,以便适当避免。

    如何在 MSI 安装过程中隐藏“取消”按钮?

    1. msiexec.exe: 您可以通过使用 ! 执行基本用户界面级别安装时指定的命令行选项:msiexec.exe /I Setup.msi /QB-!。您可以将批处理文件与您的 MSI 一起交付以像这样安装,或在您的分发系统(SCCM 或类似系统)中配置它。

    2. Windows Installer API(在 MSI 之外运行):您可以通过MSI API COM automation(VBScript 和其他脚本)或MSI API Win32 installer functions(C++)调用安装。这里是VBScript:

      Dim Installer As Object
      Set Installer = CreateObject("WindowsInstaller.Installer")
      Installer.UILevel = msiUILevelBasic + msiUILevelHideCancel
      Installer.InstallProduct "example.msi"
      
    3. 自定义操作(在 MSI 中运行):您可以通过发送 INSTALLMESSAGE_COMMONDATA 信息:

      Dim rec : Set rec = Installer.CreateRecord(2)
      rec.IntegerData(1) = 2
      rec.IntegerData(2) = 0
      Session.Message 184549376, rec
      

    WiX 示例标记

    这不是切片面包以来最棒的事情,但这里有一些快速的 WiX 标记 sn-ps 可插入到您的 WiX 源中。我会再看一遍,但你可以试一试:

    您需要编译到 WiX MSI 中的实际 VBScript(同上)。另存为HideCancel.vbs

    Dim rec : Set rec = Installer.CreateRecord(2)
    rec.IntegerData(1) = 2
    rec.IntegerData(2) = 0
    Session.Message 184549376, rec
    

    以及实际的 WiX 标记(插入到您的主要 WiX 项目中):

    <Binary Id='HideCancel.vbs' SourceFile='HideCancel.vbs' />
    <CustomAction Id='HideCancel.vbs' VBScriptCall='' BinaryKey='HideCancel.vbs' 
                  Execute='immediate' Return='ignore'/>
    
    <!-- You can leave out this element -->
    <InstallUISequence>
      <Custom Action='HideCancel.vbs' Before='AppSearch' />
    </InstallUISequence>
    
    <!-- Required element -->
    <InstallExecuteSequence>
      <Custom Action='HideCancel.vbs' Before='AppSearch' />
    </InstallExecuteSequence>
    

    如果您在使用 Before='AppSearch' 时遇到问题,可以尝试使用 Before='LaunchConditions'Before='FindRelatedProducts'。严格来说,您似乎不需要上面的InstallUISequence 元素。

    令人惊讶的是,似乎无法在对话框向导中禁用“取消”按钮(不确定这是否特定于 WiX,可能不是),但是一旦您的设置实际运行文件,您可以在安装进度对话框中隐藏它复制或安装操作本身 - 希望这是您需要的?

    如果您还想禁用设置向导对话框中的 Cancel 按钮,则需要修改 WiX 对话框控件,这需要更多的工作。 FireGiant 教程UI WizardryUser Interface Revisited

    【讨论】:

    • 感谢您的回复。请检查我是否已编辑问题。
    • 我用 C++ 运行了一个测试,如果你将HideCancelButton 放在InstallUISequenceInstallExecuteSequence 中,它似乎可以工作。我不确定为什么。我在两个序列中运行它们After='AppSearch'。隐藏取消有多重要,我们能问一下为什么需要它吗?也许您需要更改对话框集?
    • 实际上我有一些任务可以在 installFinilize 之后运行,在这种情况下,如果用户单击取消按钮,安装程序不会回滚。这就是我想隐藏按钮的原因
    • 这些是什么任务?我希望他们不需要提升权限?在 InstallFinalize 之后,与立即模式自定义操作相关的几个问题。
    • 它们是一些 power builder 命令,在 installFinizlize 之前我无法运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2021-10-19
    • 1970-01-01
    相关资源
    最近更新 更多