WiX:有条件地注册应用程序以在 Windows 启动时启动

Posted

技术标签:

【中文标题】WiX:有条件地注册应用程序以在 Windows 启动时启动【英文标题】:WiX: conditionally register application to start when Windows launches 【发布时间】:2014-03-12 18:30:32 【问题描述】:

我想根据退出对话框中的复选框注册我的应用程序以在 Windows 启动时启动。

我关注了this,但似乎在结束对话框(以及相关的复选框)出现之前就完成了对注册表的写入。

我的代码是: 在 product.wxs 中:

<Property Id="APP_AUTOMATIC_START_UP">1</Property>
....
<Component Id="AppAutoStartUp" Guid="MyGuid">
<RegistryValue Id="App.rst" Root="HKCU" Action="write" Key="Software\Microsoft\Windows\CurrentVersion\Run" Name="App" Value="[#MyApp.exe]" Type="string" />
<Condition><![CDATA[Installed OR APP_AUTOMATIC_START_UP]]></Condition>

在 MyExitDialog.wxs 中:

<Control Id="AutomaticStartup" Type="CheckBox" Height="18" Width="295" X="135" Y="190" Text="Run App upon windows startUp" Property="APP_AUTOMATIC_START_UP" CheckBoxValue="1">
<Condition Action="hide" >Installed</Condition>
<Condition Action="show" >NOT Installed</Condition>

编辑: 我尝试将密钥添加到注册表,以防用户取消选中复选框,使用自定义操作将其删除。我的代码:

[CustomAction]
public static ActionResult NotRunOnStartUp(Session session)

    session.Log("Begin NotRunOnStartUp");
    RegistryKey rk = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", true);
    rk.DeleteValue("MyApp"); 
    return ActionResult.Success;

    
<Binary Id="NotRunOnStartUpBinary" src="..\CustomActions\NotRunOnStartUp\bin\$(var.Configuration)\NotRunOnStartUp.CA.dll" />
 ...
<CustomAction Id="NotRunOnStartUpCA"
        Return="check"
        Execute="immediate"
        BinaryKey="NotRunOnStartUpBinary"
        DllEntry="NotRunOnStartUp" />
 ...   
<Publish Dialog="MyExitDialog" Control="Finish" Event="DoAction" Value="NotRunOnStartUpCA">APP_AUTOMATIC_START_UP= 0 and NOT Installed</Publish>

结果是,在安装过程中,我将密钥写入注册表,但是当我取消选中复选框并按完成时,未从注册表中删除密钥。 任何想法为什么?

【问题讨论】:

【参考方案1】:

另一种选择是根据复选框的值编写一个在安装结束时运行的自定义操作,同样您需要在卸载时删除该注册表项。

按照建议,最好将其作为应用程序的配置而不是安装。如果用户改变主意,他应该怎么做?摆弄注册表(如果他能弄清楚它在哪里)?卸载并重新安装以更改设置?

顺便说一句,程序不会“在 Windows 启动时”启动。它会在用户登录时启动,这不是一回事。如果您希望它在用户登录时启动,我会向您的用户描述它为“当您登录时”。如果您希望它在 Windows 启动时启动,它需要是一项服务。

【讨论】:

谢谢!它已经可以从应用程序中配置,但我仍然希望它也可以从安装程序中获得。我根据您的回答编辑了我的问题,尝试使用自定义操作无效。【参考方案2】:

听起来你有一个条件特征。删除该复选框并改为创建一个子功能。


另一个镜头...

这样的用户选择不是安装问题;它们是配置问题。两者之间有一条细线和波浪线。应用程序的程序应该管理它自己的配置。

安装完成并且您的用户做出配置选择后,您的安装程序可以使用命令行参数启动配置程序,以添加或修改运行键。

安装程序可以在卸载时删除注册表项,因为清理 Run 键比保留用户再次安装应用程序时的选择要好。

【讨论】:

以上是关于WiX:有条件地注册应用程序以在 Windows 启动时启动的主要内容,如果未能解决你的问题,请参考以下文章

有条件地卸载 Wix 中的先前版本

如何根据目标机器(32 位或 64 位)有条件地使用 WiX 安装文件?

WiX 条件注册表项

WiX Burn - 根据条件设置 InstallFolder 变量

WiX ScheduleReboot 不遵守条件

如何使用 wix 在卸载时编写注册表项