如何:使用 Wix 工具集使程序在 Windows 启动时启动?
How to : Making a program start on Windows startup with wix toolset?
我有简单的 "Hello world" windows 表单应用程序(在 VS-2013 中创建)。
如何使用 WIX 工具集在 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 项目中以及如何添加? 我需要逐步解释才能理解这一点。 整个 Product.wxs 的 Hello World 项目示例将是最好的。
编辑 2:
我仍然不知道如何用 wix 解决这个问题。我使用了不同的方法:How to run a C# application at Windows startup?
当 Windows 启动时,您只能 运行 一个程序,方法是将其设为服务,或者可能是 Windows 启动时启动它的任务计划任务。但是,此时没有人登录(并且可能在一段时间内不会登录),因此您不能 运行 需要使用桌面的应用程序。如果你真的想 "when a user logs on" 那么至少有几个选择:
在“程序菜单启动”文件夹中添加应用程序的快捷方式。
在注册表 运行 项中添加应用程序的路径。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa376977(v=vs.85).aspx
我还没有时间在家里的 Wix Directory 项目中测试结构,但从我的头顶看,目录结构应该是这样的
<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>
在产品下的功能标签中添加对新组件的引用
所以现在您的产品声明将如下所示
<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" />
这个:
<!-- ADD THIS -->
<Directory Id="StartupFolder" ...>
<Directory Id="MyShortcutFolder" ... />
</Directory>
应该是:
<Directory Id="StartupFolder" ...>
</Directory>
这应该可以解决您的两个错误
我创建了 registry entry。
<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=""[#MyApp.exe]"" KeyPath="yes"/>
</RegistryKey>
</Component>
</DirectoryRef>
</Fragment>
编辑
该值应该被转义,这样路径中的任何空格都不会影响 exe 的 运行。
我有简单的 "Hello world" windows 表单应用程序(在 VS-2013 中创建)。
如何使用 WIX 工具集在 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 项目中以及如何添加? 我需要逐步解释才能理解这一点。 整个 Product.wxs 的 Hello World 项目示例将是最好的。
编辑 2:
我仍然不知道如何用 wix 解决这个问题。我使用了不同的方法:How to run a C# application at Windows startup?
当 Windows 启动时,您只能 运行 一个程序,方法是将其设为服务,或者可能是 Windows 启动时启动它的任务计划任务。但是,此时没有人登录(并且可能在一段时间内不会登录),因此您不能 运行 需要使用桌面的应用程序。如果你真的想 "when a user logs on" 那么至少有几个选择:
在“程序菜单启动”文件夹中添加应用程序的快捷方式。
在注册表 运行 项中添加应用程序的路径。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa376977(v=vs.85).aspx
我还没有时间在家里的 Wix Directory 项目中测试结构,但从我的头顶看,目录结构应该是这样的
<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>
在产品下的功能标签中添加对新组件的引用 所以现在您的产品声明将如下所示
<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" />
这个:
<!-- ADD THIS -->
<Directory Id="StartupFolder" ...>
<Directory Id="MyShortcutFolder" ... />
</Directory>
应该是:
<Directory Id="StartupFolder" ...>
</Directory>
这应该可以解决您的两个错误
我创建了 registry entry。
<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=""[#MyApp.exe]"" KeyPath="yes"/>
</RegistryKey>
</Component>
</DirectoryRef>
</Fragment>
编辑
该值应该被转义,这样路径中的任何空格都不会影响 exe 的 运行。