【问题标题】:How to tell if user clicked Cancel when calling MSI functions?调用 MSI 函数时如何判断用户是否单击了取消?
【发布时间】:2010-11-02 21:35:38
【问题描述】:

我的安装程序引导应用程序在开始时会进行一系列 MSI 调用,以便从 MSI 中获取信息(安装了哪些版本、安装了哪些功能、属性值、路径等)。在进行这些 MSI 调用时,Windows 安装程序会弹出一个带有“取消”按钮的窗口。我的代码到处都有陷阱来检查 MSI 调用返回的错误代码是否是 ERROR_INSTALL_USEREXIT 以便引导应用程序可以在用户单击取消时停止,但我所看到的所有返回值,即使我确定我设法点击了取消按钮(我实际上看到按钮被按下),是 ERROR_SUCCESS。

有什么方法可以 100% 确定地判断用户是否在进行 MSI 调用时点击了取消?如果没有,有没有办法在 MSI 调用期间隐藏取消按钮,这样用户就不会误以为他可以在那个时候取消? (在速度快的机器上,这不是什么大问题,因为对话会很快消失,但在速度较慢的机器上,用户实际上有机会点击按钮。)

【问题讨论】:

    标签: c++ windows-installer


    【解决方案1】:

    如果我理解正确,听起来您正在获得小的“准备安装”样式对话框。如果是这种情况,您想要做的是在您的呼叫前加上MsiSetInternalUI 以隐藏所有(或大部分)用户界面。请注意,如果您随后调用 MsiInstallProduct 或类似方法来启动安装,您可能需要恢复非静默 UI 级别。

    如果我误读了您的问题,而您是在谈论自定义操作,那么您的代码可以通过MsiProcessMessage 的返回码找到用户取消操作的唯一位置,这也是您想要的 API用于禁用取消按钮。

    【讨论】:

    • 谢谢。虽然有点极端,但它确实实现了我所追求的,主要是为了摆脱那个取消按钮,因为我似乎无法获得可靠的方法来确定它是否被点击。
    猜你喜欢
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2017-08-16
    • 2013-12-27
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多