也就是说,用户安装msix后,应该有快捷方式。或者至少,应用程序在首次启动后创建快捷方式。不是一些安装后脚本。
我尝试了desktop7:快捷方式,但没有出现快捷方式。
首先,如果您使用MSIX打包WinUI3应用程序,则无法从exe启动您的程序。这是预期的行为。
如果您需要在桌面上创建快捷方式,首先您需要使您的应用程序成为非打包(unpackaged)和自包含),您需要修改您的csproj文件。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<WindowsPackageType>None</WindowsPackageType>
<WindowsAppSDKSelfContained>true</WindowsAppSDKSelfContained>
</PropertyGroup>
<Target Name="RemoveFoldersWithMuiFiles" AfterTargets="Build">
<ItemGroup>
<RemovingFiles Include="$(OutDir)*\*.mui" Exclude="$(OutDir)en-us\*.mui" />
<RemovingFolders Include="@(RemovingFiles->'%(RootDir)%(Directory)')" />
</ItemGroup>
<RemoveDir Directories="@(RemovingFolders)" />
</Target>
然后您可以尝试使用 Windows 脚本宿主创建桌面快捷方式。
项目 > 添加引用 > COM > Windows 脚本宿主对象模型。
using IWshRuntimeLibrary;
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool QueryFullProcessImageName(IntPtr hProcess, uint dwFlags,
[Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpExeName,
ref uint lpdwSize);
private void CreateShortcut()
{
// Get a handle to the current process
IntPtr hProcess = Process.GetCurrentProcess().Handle;
uint dwFlags = 0;
StringBuilder lpExeName = new StringBuilder(260);
uint lpdwSize = (uint)lpExeName.Capacity;
//Get exe path
bool result = QueryFullProcessImageName(hProcess, dwFlags, lpExeName, ref lpdwSize);
object shDesktop = (object)"Desktop";
WshShell shell = new WshShell();
string shortcutAddress = (string)shell.SpecialFolders.Item(ref shDesktop) + @"\yourAppName.lnk";
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutAddress);
shortcut.Description = "New shortcut for a yourAppName";
shortcut.Hotkey = "Ctrl+Shift+N";
shortcut.TargetPath = lpExeName.ToString();
shortcut.Save();
}