如何使用Wix Toolset让程序开机自启动?

5

我有一个简单的“Hello world”窗体应用程序(在VS-2013中创建)。


如何使用WIX Toolset使应用程序在Windows启动时自动启动?


必须在Windows7和Windows8中运行。


这是我目前拥有的Product.wxs文件。

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="Installer" Language="1033" Version="1.0.0.0" Manufacturer="DMC" UpgradeCode="808c333f-09f7-45d5-a5ab-ea104c500f2b">
        <Package Id="*" InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
        <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
        <MediaTemplate />
        <Feature Id="ProductFeature" Title="Installer" Level="1">
            <ComponentGroupRef Id="ProductComponents" />
        </Feature>
    </Product>
    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLFOLDER" Name="HelloWorld" />
            </Directory>
      <Directory Id="StartupFolder">
      </Directory>
        </Directory>
    </Fragment>
    <Fragment>
        <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
      <Component Guid="{A4744AE7-211C-42A0-887D-1701D242776C}">
        <File Source="$(var.HelloWorld.TargetPath)" KeyPath="yes" />
      </Component>
  </ComponentGroup>
    </Fragment>
</Wix>

编辑:
感谢您的帮助,但对我来说还不够好。在哪里添加这些标签?我应该创建快捷方式,还是wix会为我做到这一点?我需要将快捷方式包含在wix中,如何操作?我需要将.ico文件包含在wix项目中,如何操作?我需要逐步解释才能理解这个问题。最好提供Hello World项目示例的Whole Product.wxs。
编辑2:
我仍然不知道如何使用wix解决这个问题。我采用了不同的方法:如何在Windows启动时运行C#应用程序?

3个回答

11

我还没有时间在家里的Wix目录项目中测试这个结构,但从我的头脑中可以初步设想目录结构应该是这样的

<Directory Id="TARGETDIR" Name="SourceDir"> 
  <Directory Id="ProgramFilesFolder"> 
    <Directory Id="INSTALLDIR" .. > 
      <Component ... > 
        <File ... > 
          <Shortcut Id=".." Directory="StartupFolder" ...> 
            <Icon ... /> 
          </Shortcut> 
        </File> 
      </Component> 
    </Directory> 

    <!-- ADD THIS --> 
    <Directory Id="StartupFolder" ...> 
      <Directory Id="MyShortcutFolder" ... /> 
    </Directory> 
  </Directory> 
</Directory> 

** 更新 **

默认情况下,包含目录结构的代码片段紧随产品元素之后。

在声明安装所需的目录结构的片段中,您将添加对Windows“启动”文件夹的目录引用。

随后,您必须创建一个组件,以指示它获取文件并在您传递为引用的目录(“启动”文件夹)中创建一个快捷方式。

当安装程序启动时,它将把快捷方式复制到您引用的目录中指定的文件中。

** 来自您的源代码 **

在包含产品组件的代码片段中添加此声明。

<DirectoryRef Id="StartupFolder">
  <Component Id="ApplicationShortCutStartUp" Guid="{BCC2E481-53AF-4690-912D-1051B930B910}">
    <Shortcut Id="AppShortCutStartUp" Name="DMC"
              Description="DMC HELLO"
              Target="[INSTALLDIR][[ NAME OF YOUR EXE]]"
              WorkingDirectory="INSTALLDIR" />


    <RegistryKey Root="HKLM" Key="DMC\HelloWorld" Action="createAndRemoveOnUninstall">
      <RegistryValue Name="ShortCutStartUp" Type="integer" Value="1" KeyPath="yes"  />
    </RegistryKey>        
  </Component>

</DirectoryRef>
在产品的 Feature 标签下添加对新组件的引用,现在您的产品声明将如下所示。
  <Product Id="*" Name="Installer" Language="1033" Version="1.0.0.0" Manufacturer="DMC" UpgradeCode="808c333f-09f7-45d5-a5ab-ea104c500f2b">
    <Package Id="*" InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
    <MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
    <MediaTemplate />
    <Feature Id="ProductFeature" Title="Installer" Level="1">
      <ComponentGroupRef Id="ProductComponents" />
      <ComponentGroupRef Id="ApplicationShortCutStartUp" />
    </Feature>
  </Product>

这将会在您机器的启动文件夹中创建一个快捷方式。

调整

这样做:

<ComponentGroupRef Id="ApplicationShortCutStartUp" />
应该是这样的。
<ComponentRef Id="ApplicationShortCutStartUp" />
这是一个空的 HTML 元素。
<!-- ADD THIS --> 
<Directory Id="StartupFolder" ...> 
  <Directory Id="MyShortcutFolder" ... /> 
</Directory> 

应该是:

空格

<Directory Id="StartupFolder" ...> 
</Directory> 

那应该可以解决你的两个错误。


谢谢,但对我来说还不够好。我应该在哪里添加这些标签?我应该创建快捷方式,还是Wix会为我完成?我需要将快捷方式包含到Wix中吗,如何操作?我需要将ico包含到Wix中吗,如何操作?我需要逐步解释才能理解这个过程。 - Raskolnikov
2
你可以在这里获取我的Product.wxs文件:http://s000.tinyupload.com/?file_id=95468873217085583093 - Raskolnikov
我有两个错误:在“片段:”中未解析符号“Directory:StartupFolder”的引用和在“产品:*”中未解析符号“WixComponentGroup:ApplicationShortCutStartUp”的引用。 - Raskolnikov
1
你可以在这里获取我调整过的 Product.wxs 版本:http://s000.tinyupload.com/?file_id=70821424679111671809 - CheGueVerra
很遗憾,我直到周一才能测试这个,但我会让你知道的。 - Raskolnikov
显示剩余7条评论

4
我创建了一个注册表项。请参考此链接
<FeatureId="ProductFeature"Title="MyApp"Level="1">
    <ComponentRefId="RegistryEntries"/>
</Feature>

<Fragment>
    <DirectoryRef Id="ApplicationProgramsFolder">

      <Component Id="RegistryEntries" Guid="PUT-GUID-HERE">
        <RegistryKey Root="HKCU"
                     Key="Software\Microsoft\Windows\CurrentVersion\Run"
              Action="createAndRemoveOnUninstall">
          <RegistryValue Type="string" Name="MyApp" Value="&quot;[#MyApp.exe]&quot;" KeyPath="yes"/>          
        </RegistryKey>
      </Component>
    </DirectoryRef>
  </Fragment>

编辑

应该对该值进行转义,以防路径中的任何空格影响exe文件的运行。


3
您只能通过将程序设置为服务或者创建一个任务计划来在Windows启动时运行它。然而,在此时没有用户登录(也许有一段时间没有用户登录),因此您不能运行需要使用桌面的应用程序。如果您真正的意思是“当用户登录时”,那么至少有两个选择:
1. 在“开始”菜单的“启动”文件夹中添加应用程序的快捷方式。 2. 将应用程序路径添加到注册表“Run”键中。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa376977(v=vs.85).aspx

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Raskolnikov
然后,我将在WIX代码片段中定义目录,并在启动文件夹中创建应用程序的快捷方式。 - CheGueVerra
1
@CheGueVerra :好的,太棒了!怎么做呢? - Raskolnikov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接