Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通用应用程序的快捷方式_C#_Uwp - Fatal编程技术网

C# 通用应用程序的快捷方式

C# 通用应用程序的快捷方式,c#,uwp,C#,Uwp,我正在创建一个Xamarin.Forms应用程序,我想有一个选项来创建桌面快捷方式(我已经在Android上实现了) 我有一个协议可以用来启动我的应用程序,所以这不是一个问题,我已经在桌面上保存了另一种类型的文件进行测试,我唯一的问题是我无法创建.lnk文件 在我的研究中,我看到了很多关于如何以编程方式创建.lnk文件的解释,但所有教程都与WindowsForms或PowerShell脚本相关(据我所知,UWP不允许执行PS脚本) 那么,有没有办法创建桌面快捷方式 回答后编辑 当我使用对话框创

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

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

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

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


回答后编辑

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

Windows 10桌面快捷方式的替代品是一个实时互动程序,它基本上是一个Android图标的实时版本。您可以通过手动将活动互动程序拖动到桌面来创建桌面快捷方式

如果您想要一种编程方式,并且已经注册了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
让用户选择一个她想要保存快捷方式的文件夹。它仍然非常方便用户,甚至让她可以灵活地在桌面以外的其他地方使用快捷方式

更新 我对这个问题进行了极其详细的分析,发现了这个问题。它彻底解释了为什么我们遇到这些问题-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:\Windows\explorer.exe shell:AppsFolder{PackageFamilyName}!应用程序

我使用以下代码在应用程序第一次运行时生成快捷方式(您需要向Windows脚本主机添加COM引用):

PackageFamilyName: 您的应用程序族名称应该是一个巨大的字母数字散列,获取该名称的最简单方法是将其安装到某个位置,然后使用powershell命令get-AppxPackage。它也可以通过Package.Current.Id.FamilyName代码获得

图标位置:这不是必需的,它应该使用应用程序的默认图标。我改变了这个,因为它使用了一个丑陋的蓝色背景的版本。将图标添加到生成输出文件夹并如上所述链接,可以选择图标


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

好的,谢谢您的支持!:)我已经试过好几种方法,但似乎都不管用。我尝试添加.url文件的其他行,我尝试在添加内容(复制和粘贴)后以编程方式手动创建同一文件的副本,但什么都没有。我认为值得注意的是,当我使用命令行创建一个.url文件并向该文件中添加两行所需的行时(PS>
“[InternetShortcut]”>>shortcut.url;“url=yourapp://“>>shortcut.url
),错误仍在发生,因此,它与从UWP应用程序调用的代码无关。经过几个小时的尝试,我在LocalApp文件夹中创建了一个运行正常的.url文件。坏消息是,每次我尝试将其复制/移动到FolderPicker的选定文件夹时,它都会说权限被拒绝。但是如果我尝试移动其他类型的文件,它会按预期工作。。。我将用我当前的代码再次更新问题。您好,我已用另一次尝试再次更新了答案,该尝试似乎对我的PC有效,请确保使用随机文件名进行尝试,该文件名
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();