通用应用的快捷方式

时间:2018-01-05 01:16:17

标签: c# uwp

我正在创建一个Xamarin.Forms应用,我希望有一个创建桌面快捷方式的选项(我已在Android上实现)。

我有一个可以用来启动我的应用程序的协议,所以这不是一个问题,我已经在桌面上保存了另一种类型的文件进行测试,我唯一的问题是我无法创建一个.lnk文件。

在我的研究中,我看到了很多关于如何以编程方式创建.lnk文件的解释,但所有教程都与WindowsForms或PowerShell脚本相关(据我所知,UWP不允许执行PS脚本) )。

那么,有没有办法创建桌面快捷方式?

回答后编辑

当我使用Dialog创建快捷方式时,一切都很好,但是当我在应用程序中创建它时,快捷方式的图标不会更改为我的应用程序的图标,它会显示一个我运行时确认,确认后,会显示一条错误消息,说明目标""此Internet快捷方式无效。

Shortcut with default icon

但是如果我以任何方式更改文件(重命名,复制并粘贴或更改其内容),它会将图标更改为正确的文件,当我确认对话框时,它会打开我的应用程序预期。这证明文件或其内容没有任何问题,但我不知道如何解决这个问题。

修改

StorageFile shortcutFile = null;

try
{
    shortcutFile = await ApplicationData.Current.LocalFolder.GetFileAsync("shortcut.url");
}
catch (Exception) { }

if (shortcutFile == null)
{
    shortcutFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("shortcut.tmp", CreationCollisionOption.ReplaceExisting);
    await FileIO.WriteLinesAsync(shortcutFile, new string[] { "[InternetShortcut]", "URL=yourapp:///" });

    string newShortcutName = shortcutFile.Path.Substring(0, shortcutFile.Path.Length - 4) + ".url";
    File.Move(shortcutFile.Path, newShortcutName);

    shortcutFile = await ApplicationData.Current.LocalFolder.GetFileAsync(newShortcutName.SplitWithoutEmpty('\\').Last());
}

FolderPicker savePicker = new FolderPicker
{
    SuggestedStartLocation = PickerLocationId.Desktop
};
savePicker.FileTypeFilter.Add(".url");
StorageFolder folder = await savePicker.PickSingleFolderAsync();

if (folder != null)
{
    // Works fine until here, then it throws an exception (Permission Denied)
    await shortcutFile.CopyAsync(folder, shortcutFile.Name);
}

3 个答案:

答案 0 :(得分:2)

Windows 10桌面快捷方式的替代方案是Live Tile,它基本上是Android图标的实时版本。您可以通过手动将Live Tile拖动到桌面来创建桌面快捷方式。

如果您想要一种编程方式并且已经注册了URI协议,那么您应该能够创建url快捷方式而不是经典方式。让我们一步一步看:

您可以使用对话框手动创建URL缩短:

manual shortcut creation

现在,这将在您的桌面上创建一个.url文件,该文件就像一个快捷方式。您可以在dir命令列表中看到它:

dir command output

现在尝试使用ren命令将文件重命名为具有不同的扩展名,例如:

ren YourApp.url YourApp.urltext

您现在可以在文本编辑器中正常打开此文件以查看其内容:

[{000352A0-0000-0000-C000-000000000012}]
Prop3=19,0
[InternetShortcut]
IDList=
URL=yourapp:///

从我的测试看来,前两行似乎是不必要的,IDList属性也是多余的。这意味着您可以执行以下操作:

[InternetShortcut]
URL=yourapp:///

如果您将文件重命名为.url扩展名并双击它,则会启动与yourapp协议关联的应用,这正是您所需要的。

因此,要以编程方式执行此操作,您必须使用我们刚刚提出的内容保存.url文件,并将其保存在用户想要创建快捷方式的位置。

有一个缺点,您必须记住 - UWP应用程序是沙盒,因此您无法在未经用户同意的情况下直接在桌面上创建文件。我现在能看到的最好方法是使用FileSavePicker让用户选择要保存快捷方式的文件夹。它仍然非常友好,甚至可以让她灵活地将快捷方式放在桌面以外的地方。

更新

我发现this SO answer对此问题进行了非常详细的分析。它彻底解释了我们遇到这些问题的原因 - 这些URL文件由Internet Explorer解释,一旦解释,URL信息将存储为NTFS元数据。我建议首先使用临时扩展名创建文件,然后只有然后将其重命名为.url。我现在不在我的电脑上,但是当我到达那里时我会尝试:-)

更新2

经过一段时间的游戏后,我想出了以下内容,它“部分可以在我的电脑上运行”。快捷方式已成功创建,甚至有正确的图标,但每次打开时都会显示“来自不同计算机的文件”确认对话框,只能通过属性关闭。

FileSavePicker savePicker = new FileSavePicker
{
    SuggestedStartLocation = PickerLocationId.Desktop
};
savePicker.FileTypeChoices.Add("Shortcut", new [] { ".url" });
var saveFile = await savePicker.PickSaveFileAsync();

if (saveFile != null)
{
    await FileIO.WriteLinesAsync(
       saveFile, 
       new string[] { "[InternetShortcut]", "URL=yourapp:///" });
}

答案 1 :(得分:1)

我找到了一个更简单的方法。

你只需要用目标创建一个普通的快捷方式 C:\Windows\explorer.exe shell:AppsFolder{PackageFamilyName}!App

我使用以下代码在应用程序第一次运行时生成快捷方式(您需要添加对 Windows Scripting Host 的 COM 引用):

string shortcutLocation = Path.Combine(Environment.SpecialFolder.Desktop, shortcutName + ".lnk");
WshShell shell = new();
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutLocation);

shortcut.IconLocation = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "icon.ico");
shortcut.Arguments = $"shell:AppsFolder\\{insert your PackageFamilyName}!App";
shortcut.TargetPath = Path.Combine(Environment.GetEnvironmentVariable("windir"), "explorer.exe");
shortcut.Save();

包系列名称: 您的应用系列名称应该是一个巨大的字母数字哈希,获得它的最简单方法是将其安装在某处并使用 powershell 命令 Get-AppxPackage https://docs.microsoft.com/en-us/powershell/module/appx/get-appxpackage?view=windowsserver2019-ps。也可以通过 Package.Current.Id.FamilyName 在代码中获取。

图标位置:这不是必需的,它应该使用您的应用程序的默认图标。我改变了这一点,因为它使用了一个带有难看的蓝色背景的版本。将一个图标添加到您的构建输出文件夹并按上述方式进行链接,这样您就可以选择该图标。

还应注意,快捷方式的鼠标悬停文本是 windows 资源管理器。如果有人找到解决方法,请告诉我。

答案 2 :(得分:0)

另一种选择可能是添加一个 ExecutionAlias 并直接创建别名的快捷方式。

在 Package.appxmanifest 中

xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5"

<Extensions>
  <uap5:Extension Category="windows.appExecutionAlias" EntryPoint="Windows.FullTrustApplication" Executable="MyApp\MyApp.exe">
    <uap5:AppExecutionAlias>
      <uap5:ExecutionAlias Alias="MyApp.exe" />
    </uap5:AppExecutionAlias>
  </uap5:Extension>
</Extensions>

然后制作MyApp.exe的快捷方式