如何:使用wix工具集在Windows启动时启动程序?

时间:2015-02-03 17:34:47

标签: xml visual-studio-2013 wix

我有简单的“Hello world”Windows窗体应用程序(在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项目示例的整个Product.wxs将是最好的。
编辑2:
我仍然不知道如何用wix解决这个问题。我使用了不同的方法:How to run a C# application at Windows startup?

3 个答案:

答案 0 :(得分:6)

我没有时间在家里的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> 

**更新**

默认情况下,包含目录结构的Fragment就在产品元素之后。

在声明安装所需的目录结构的Fragment中,您将目录引用添加到windows下的Start Up文件夹中。

之后,您必须创建一个组件,指示它获取文件并在您作为参考传递的目录中创建一个ShortCut(启动文件夹)。

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

**来自你的来源**

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

<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>

在产品下的功能标记中添加对新组件的引用 所以现在您的产品声明将如下所示

  <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>

这会将快捷方式复制到您机器的启动文件夹中。

ADJUSTMENTS

此:

<ComponentGroupRef Id="ApplicationShortCutStartUp" />

应该

<ComponentRef Id="ApplicationShortCutStartUp" />

此:

                                                                                         

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

 

应该是:

               

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

 

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

答案 1 :(得分:4)

您只能在Windows启动时通过将其作为服务运行程序,或者在Windows启动时启动它来执行任务计划任务。但是,此时没有人登录(并且可能暂时不会登录),因此您无法运行需要使用桌面的应用程序。如果你的意思是“当用户登录时”,那么至少有几个选择:

  1. 在“程序菜单启动”文件夹中为应用程序添加快捷方式。

  2. 在注册表运行键中添加应用程序的路径。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa376977(v=vs.85).aspx

答案 2 :(得分:2)

我创建了registry entry

<FeatureId="ProductFeature"Title="MyApp"Level="1">
    <ComponentRefId="RegistryEntries"/>
</Feature>

<Fragment>
    <DirectoryRef Id="ApplicationProgramsFolder">

      <Component Id="RegistryEntries" Guid="1efc6d21-bf25-498d-b293-0f4ed02b6fbF">
        <RegistryKey Root="HKCU"
                     Key="Software\Microsoft\Windows\CurrentVersion\Run"
              Action="createAndRemoveOnUninstall">
          <RegistryValue Type="string" Name="MyApp" Value="[#MyApp.exe]" KeyPath="yes"/>          
        </RegistryKey>
      </Component>
    </DirectoryRef>
  </Fragment>