最近在开发应用的过程中,我遇到了如标题所述的需求,其实主要是为了能够快捷启动应用,正像我们可以在 "运行" 对话框中可以输入一些可执行程序的名称后,就能够直接启动它;这样做,可以增加 App 的易用性.在查了一些文档后,得知在 Windows Build 16266 之后,就加入相关的 API,因此要实现以及使用这一功能,Window 系统和 SDK 的版本都要大于 16266,Fall Creators Update (Build 16299) 则完全满足这一条件.
实现
要使用命令行启动 UWP 应用,其实非常简单,只需要两步:首先,在 Package.appxmanifest 中添加 appExecutionAlias 扩展;然后,在 App.OnActived 事件中做相应的处理.
1. 修改 Package.appxmanifest
右击项目中的 Package.appxmanifest 文件,在快捷菜单中选择 "打开方式"->"XML 文本编辑器".打开后,对它的内容按以下修改:
其中加粗部分是我们需要补充的内容.可以看到,我们添加了一个名为 appExecutionAlias 的扩展 (Extension).在 Extension 节点中包括了几个属性,它们的意义分别如下:
<Package
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5"
IgnorableNamespaces="uap mp uap5">
...
<Applications>
<Application
...
<Extensions>
<uap5:Extension
Category="windows.appExecutionAlias"
Executable="TestCmdLineApp.exe"
EntryPoint="TestCmdLineApp.App">
<uap5:AppExecutionAlias>
<uap5:ExecutionAlias Alias="App.exe" />
</uap5:AppExecutionAlias>
</uap5:Extension>
</Extensions>
</Application>
</Applications>
...
</Pakage>
1) Category 属性指明 Extension 的类别,对于我们当前的需求,它的值固定为 windows.appExecutionAlias,即为应用的运行提供别名;
2) Executable 属性指明当前应用的 exe 名称,也即:程序集名称 + ".exe";
3) EntryPoint 属性指明当前应用的入口点,也即 App 类的完整名称(包含其所在的命名空间);
4) 在 AppExecutionAlias\ExecutionAlias 节点中的 Alias 属性,就是我们为要为当前应用定义的命令行启动名称;这里需要说明三点:
a) 它可以与前面 Executable 属性值相同,也可以不同,比如更简短一些,便于用户记住与输入;
b) 如果定义的别名,已经被当前机器上安装的其它应用占用了,那么它就不会生效,也即,谁先占用就对谁有效(当然,如果先前占用的应用被卸载了,那么这个别名就可以被你的应用使用);
c) 可以添加多个 ExecutionAlias 节点,为应用指定多个别名.通过为应用提供更多的别名,可以解决别名被占用的问题(如果确实存在这个问题).
2. 处理 OnActivated 事件
在 App.OnActived 事件中,我们对 IActivatedEventArgs 参数类型判断,如果其 Kind 属性为 CommandLineLaunch,则认为是命令行启动,接下来所做的就像在 OnLaunched 事件中一样,对 Frame 初始化并导航到应用的主页,如下:
3. 参数处理
protected override void OnActivated(IActivatedEventArgs args)
{
if (args.Kind == ActivationKind.CommandLineLaunch)
{
// ...
}
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame == null)
{
rootFrame = new Frame();
rootFrame.NavigationFailed += OnNavigationFailed;
Window.Current.Content = rootFrame;
}
rootFrame.Navigate(typeof(MainPage));
Window.Current.Activate();
base.OnActivated(args);
}
使用命令行启动应用有一个很大的好处,用户在启动时可以携带参数,如: app.exe a, app.exe a b, app.exe /type:a 等,而应用则根据用户提供的参数作相应的处理.要得到用户传递的参数,只要将 IActivatedEventArgs 类型的参数转换为 CommandLineActivatedEventArgs,通过它的 Operation.Arguments 属性即可得到,剩下的就是对参数进行分析并根据参数进行相应的处理.除了参数,我们也能够得到用户是从哪个目录启动 App 的,这是通过 Operation.CurrentDirectoryPath 属性得到的.完整代码如下:
最后,要测试效果,需要部署 (Deploy) 应用.
protected async override void OnActivated(IActivatedEventArgs args)
{
string arugment = string.Empty;
if (args.Kind == ActivationKind.CommandLineLaunch)
{
var cmdArgs = args as CommandLineActivatedEventArgs;
StringBuilder sb = new StringBuilder();
sb.AppendLine($"Argument: {cmdArgs.Operation.Arguments}");
sb.AppendLine($"CurrentDirectoryPath: {cmdArgs.Operation.CurrentDirectoryPath}");
await new MessageDialog(sb.ToString()).ShowAsync();
}
Frame rootFrame = Window.Current.Content as Frame;
if (rootFrame == null)
{
rootFrame = new Frame();
rootFrame.NavigationFailed += OnNavigationFailed;
Window.Current.Content = rootFrame;
}
rootFrame.Navigate(typeof(MainPage), arugment);
Window.Current.Activate();
base.OnActivated(args);
}
部署完成后,在 "运行"(Win + R) 对话框中输入上面定义的别名(和参数),即可.当然,在 "命令提示符" 窗口甚至在 "资源管理器" 窗口的地址栏中,你都可以输入别名来启动应用.
背后原理
为什么在上述这些位置我们输入别名后,就可以运行应用呢?为了解决这个问题,首先我们使用 where 命令得看看对应的命令究竟在哪里.在 "命令提示符" 窗口中,输入: where 别名,得到这样的结果:
在 "资源管理器" 中打开对应的路径,会看到在这个目录下存放了当前机器中所有那些使用别名的应用,其实这里的文件可以认为是一个快捷方式.
C:\Users\Admin>where app
C:\Users\Admin\AppData\Local\Microsoft\WindowsApps\App.exe
不仅如此,这个目录也在 PATH 环境变量中(可在 "命令提示符" 中使用 path 命令查看或在 "系统属性" 的 "环境变量" 对话框中查看),因此,我们才可以在任何位置都能启动应用.
除此以外,作为用户,我们还可以在桌面(或其它任何目录)为应用创建快捷方式,右击桌面 -> 创建快捷方式,然后输入别名 和参数(可选).通过双击快捷方式图标,也可以启动应用.这一点类似于创建磁贴,不过,它要比磁贴更灵活.我们甚至还可以为不同的参数创建多个快捷方式,也可以为每个快捷方式指定不同的图标.这样,是不是感觉更像 Win32 应用了呢?
总结
本文主要提到了如何使用命令行来启动 UWP 应用,为应用提供这一特性可以为其增加易用性以及灵活性.作为 App 的使用者,可以更便利,更灵活地打开,使用应用.这样,使得 UWP 应用和 Win32 程序的行为更加一致.
参考资料:
Command-Line Activation of Universal Windows Apps
来源: https://www.cnblogs.com/wpinfo/p/uwp_commandline_launch.html