c# - 通用应用程序的快捷方式

标签 c# uwp

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

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

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

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


回答后编辑

当我使用对话框创建快捷方式时,一切都很好,但是当我在应用程序中创建快捷方式时,快捷方式的图标不会更改为我的应用程序的图标,它会在我运行它时显示确认,并在确认后,它显示一条错误消息,指出此 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);
}

最佳答案

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

如果您想要一种编程方式并且已经注册了 URI 协议(protocol),那么您应该能够创建 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 协议(protocol)关联的应用程序,这正是您所要执行的需要。

因此,要以编程方式执行此操作,您必须保存一个 .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:///" });
}

关于c# - 通用应用程序的快捷方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48105881/

相关文章:

c# - 使用 ThreadPool 进行垃圾收集

visual-studio - 参数 targetplatformversion 不能为 null - visual studio 2015

xaml - 在 Windows 通用应用程序 (UWP) 中使用 Tab 和 Alter Tab 时生成 "global::System.Diagnostics.Debugger.Break()"错误

gridview - Horizo​​ntalChildrenAlignment ="Stretch"在 WrapGrid 中不起作用

c# - 如何使用 ASP.NET MVC4 登录?

c# - AutoMapper 不映射子属性

c# - 等待一个漫长的过程,还在更新UI

c# - Monotouch C# 通过音量控制同时播放多种声音

c# - 绑定(bind)与 x :Bind: Why isn't the view updated when using Binding?

c# - ParallaxView 在 4 月更新后不起作用