65.9K
CodeProject 正在变化。 阅读更多。
Home

AppRunner – 简单的“桌面快捷方式”替代品

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2015年2月8日

CPOL

4分钟阅读

viewsIcon

28535

downloadIcon

642

一个基于 WTL、XML 驱动的快捷方式替代品

引言

AppRunner 是一个简单的工具,用作 Windows 桌面快捷方式的替代品。快捷方式按选项卡组织,其内容定义在一个简单的 XML 文件中。

使用 AppRunner 替代桌面图标的优点是

  • 图标可以通过选项卡组织
  • 图标图例会完整显示(无省略号!)
  • 文档、文件夹和应用程序路径会完整显示

背景

我们日常工作的一部分是运行多个程序、打开不同的目录和文件、测试应用程序的多个版本等。我的小团队必须维护许多不同项目的许多不同版本。不同版本的开发工具(Visual Studio 10、12、13,Texas Instruments CCS 3.0、5.0、6.0)的使用频率不同——每天、每周等。

为了跟上所有这些,我们一直使用桌面快捷方式来指向项目文件、目录、测试程序等。考虑到我们必须在多台计算机和多种配置上维护这一点,这种方法相当麻烦。AppRunner 的开发是为了简化这些操作。

快速概览

这里是一个快捷方式页面

... 还有另一个

图标按选项卡分组,通过左侧的自定义选项卡控件进行选择。每个选项卡包含多个“快捷方式”,可以选择用水平线分隔。每个快捷方式代表一个文件夹、文件或可执行文件,并可选地带命令行参数。

每个快捷方式的图标都会自动检索,使用应用程序特定的图标。无效的快捷方式会显示一个红色的“X”图标。

配置工具

AppRunner 通过外部 XML 文件进行配置,该文件可以作为命令行参数提供,或者命名为 AppRunner.xml 并位于 AppRunner.exe 的同一目录中。XML 文件包含以下几节。

各节包含在名为 AppRunner 的主根元素中

<AppRunner>
  ...
</AppRunner>

 

有两种不同类型的节——CommandPage 和 Defines

CommandPage:每个命令页面节包含每个选项卡页中快捷方式的信息。这是上面第二个页面的 CommandPage 定义

   <CommandPage name="DarkStar">
      <Item name="Darkstar Folder->"                 cmd="%DarkStar%" />
      <Item name="Darsktar Solution"                 cmd="%VStudio2013% %DarkStar%\DarkStar.sln"/>
 
      <Separator name="TI Compilers"/>
      <Item name="TI CCS 6.0"                        cmd="C:\TI\ccsv6\eclipse\ccstudio.exe" />
      <Item name="TI CCS 3.0"                        cmd="C:\TI\CCS33\cc\bin\cc_app.exe" />
   </CommandPage>

该页面包含 4 个快捷方式和一个分隔线。分隔线有一个可选的单个属性(name),指定分隔线的标题。如果未指定名称,则绘制一个简单的分隔线。

最后两个快捷方式是简单的命令,指向一个可执行文件的完整路径,在该可执行文件被点击时运行。第一个快捷方式指向一个由 %DarkStar% 指定的文件夹。DarkStar 定义为环境变量,或在 Defines 节中定义,如下所述。

Defines:这是 XML 文件中显示一些 defines 的一部分

   <Defines computer="Posidon">
      <Item name="Proj"               value="C:\_Proj" />
      <Item name="Data"               value="C:\Data" />
   </Defines>
   <Defines>
      <Item name="Program"            value="C:\Program Files (x86)" />
      
      <!-- Project Common -->
      <Item name="Proj"               value="D:\_Proj" />
      <Item name="Data"               value="D:\Data" />
   
      <!-- DarkStar -->
      <Item name="DarkStar"           value="%Proj%\_Active\Chronotek\Darkstar"/>
   </Defines>

 

Defines 分组在一个或多个节中。可选属性(computer) 用于将定义限制为特定计算机。

每个节包含多个变量定义。遇到的第一个变量定义将被使用。例如,变量 Proj 对于名为 Posidon 的计算机的值将是 C:\_Proj,而对于所有其他计算机的值将是 D:\_Proj

变量值可以使用先前定义的变量。例如,上面变量 DarkStar 的值将是 D:\_Proj\_Active\Chronotek\Darkstar(对于任何名称不是 Posidon 的计算机)。

使用代码

包含了一个 Visual Studio 2013 解决方案。最新版本可在以下地址获取: https://github.com/tkontos/AppRunner

最新版本的 boost 和 WTL 是唯一必需的外部库。

设置 Visual Studio 项目最复杂的部分是必需的外部库配置。这是许多开发人员面临的问题,我们也不例外——我们团队典型的解决方案包含 20 多个项目,其中大多数需要 boost、wtl、opencv 等。本节的其余部分描述了我们使用的方法,该方法基于导入解决方案和项目级别的设置(注意:随源码提供的项目已按以下说明进行了修改)。

手动编辑解决方案中的每个项目并添加以下行

   <Import Condition="Exists('$(SolutionPath).props')" Project="$(SolutionPath).props" />
   <Import Condition="Exists('$(ProjectName).props')" Project="$(ProjectName).props" />

这将导入(如果存在)来自解决方案级别文件(名为‘AppRunner.sln.props’,位于与解决方案相同的目录中)的设置,然后再导入项目级别文件(名为‘AppRunner.props’,位于与项目相同的目录中)。  手动编辑项目的最简单方法是右键单击解决方案资源管理器中的项目,然后选择“卸载项目”,然后再次右键单击并选择“编辑”。

这些“props”文件指定了附加的包含和库目录以及任何其他设置(在此项目中,目标目录已修改)。有关详细信息,请参见源码中包含的 AppRunnder.props 文件。

此方法的另一个优点是,可以在同一解决方案中的不同项目中使用多个版本的外部库。  在我们的一个解决方案中,一个项目需要 boost 1.36.0,另一个项目需要 boost 1.57.0。

如果您对代码进行了更改、改进了它,或者有一些更好的想法,我非常希望能收到您的反馈。  请通过 thanko [at] outlook [dot] com 与我联系。评论和建议永远受欢迎!

关注点

源码包含以下示例

  • XML 文件处理
  • 自定义选项卡控件
  • 简单的 Windows 动画
  • 文件图标
  • 恢复窗口位置

历史

2015 年 2 月 6 日    首次发布

© . All rights reserved.