我正在创建一个Xamarin.Forms应用,我希望有一个创建桌面快捷方式的选项(我已在Android上实现)。
我有一个可以用来启动我的应用程序的协议,所以这不是一个问题,我已经在桌面上保存了另一种类型的文件进行测试,我唯一的问题是我无法创建一个.lnk文件。
在我的研究中,我看到了很多关于如何以编程方式创建.lnk文件的解释,但所有教程都与WindowsForms或PowerShell脚本相关(据我所知,UWP不允许执行PS脚本) )。
那么,有没有办法创建桌面快捷方式?
回答后编辑
当我使用Dialog创建快捷方式时,一切都很好,但是当我在应用程序中创建它时,快捷方式的图标不会更改为我的应用程序的图标,它会显示一个我运行时确认,确认后,会显示一条错误消息,说明目标""此Internet快捷方式无效。
但是如果我以任何方式更改文件(重命名,复制并粘贴或更改其内容),它会将图标更改为正确的文件,当我确认对话框时,它会打开我的应用程序预期。这证明文件或其内容没有任何问题,但我不知道如何解决这个问题。
修改
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);
}
答案 0 :(得分:2)
Windows 10桌面快捷方式的替代方案是Live Tile,它基本上是Android图标的实时版本。您可以通过手动将Live Tile拖动到桌面来创建桌面快捷方式。
如果您想要一种编程方式并且已经注册了URI协议,那么您应该能够创建url
快捷方式而不是经典方式。让我们一步一步看:
您可以使用对话框手动创建URL缩短:
现在,这将在您的桌面上创建一个.url
文件,该文件就像一个快捷方式。您可以在dir
命令列表中看到它:
现在尝试使用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
。我现在不在我的电脑上,但是当我到达那里时我会尝试:-)
经过一段时间的游戏后,我想出了以下内容,它“部分可以在我的电脑上运行”。快捷方式已成功创建,甚至有正确的图标,但每次打开时都会显示“来自不同计算机的文件”确认对话框,只能通过属性关闭。
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的快捷方式