如何在 C# 中以编程方式创建桌面快捷方式 (link),但使用自己的快捷方式文件扩展名(例如 .appfolder)而不是 .lnk?
How to create a desktop shortcut (link), but with own shortcut file extension (e.g. .appfolder) instead of .lnk programmatically in C#?
我在注册表中注册了一个名为 .appfolder 的快捷方式文件扩展名:reg export
它的行为应该像一个普通的 .lnk 快捷方式,但必须以 .appfolder 结尾(这是有原因的)。
现在我想在 C# 中以编程方式使用该文件 ending/extension 创建快捷方式。
.lnk 的默认结尾适用于:
public static void CreateShortcut(string shortcutName, string shortcutPath, string targetFileLocation)
{
string shortcutLocation = Path.Combine(shortcutPath, shortcutName + @".lnk");
WshShell shell = new WshShell();
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutLocation);
shortcut.Description = "My shortcut description";
shortcut.TargetPath = targetFileLocation;
shortcut.Save();
}
//e.g:
CreateShortcut("Example (Notepad)", Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
"notepad.exe");
当我尝试将此行 string shortcutLocation = Path.Combine(shortcutPath, shortcutName + @".lnk");
中的文件扩展名更改为 .appfolder 时,我得到一个 System.Runtime.InteropServices.COMException
(HRESULT: 0x80020009 (DISP_E_EXCEPTION)
).
当我尝试使用 File.Move(shortcutLocation, Path.ChangeExtension(shortcutLocation, ".appfolder"));
在 creating/saving 快捷方式后更改文件扩展名时,我在桌面上得到一个具有以下属性的文件:image
如您所见,Windows 确实将 .appfolder 扩展名识别为快捷方式,但是缺少 'Shortcut' 选项卡,当我双击文件执行时,没有任何反应。
所以,我的 .appfolder 注册不完整,虽然它应该是......或者如何在 C# 中以编程方式创建具有自己的快捷方式文件扩展名的快捷方式?
感谢您的帮助 ;)
编辑:
我尝试了另一种以编程方式创建快捷方式的方法:
void main() {
IShellLink link = (IShellLink)new ShellLink();
// setup shortcut information
link.SetDescription("My Description");
link.SetPath(@"notepad.exe");
// save it
IPersistFile file = (IPersistFile)link;
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
file.Save(Path.Combine(desktopPath, "Notepad.appfolder"), false);
}
[ComImport]
[Guid("00021401-0000-0000-C000-000000000046")]
internal class ShellLink
{
}
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214F9-0000-0000-C000-000000000046")]
internal interface IShellLink
{
void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd, int fFlags);
void GetIDList(out IntPtr ppidl);
void SetIDList(IntPtr pidl);
void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
void GetHotkey(out short pwHotkey);
void SetHotkey(short wHotkey);
void GetShowCmd(out int piShowCmd);
void SetShowCmd(int iShowCmd);
void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cchIconPath, out int piIcon);
void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
void Resolve(IntPtr hwnd, int fFlags);
void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
}
创建快捷方式文件没有任何错误(如System.Runtime.InteropServices.COMException
,见上),但它不通过双击执行.exe文件。
我解决了:
我对 .appfolder 的注册并不完全正确,无法像 .lnk 快捷方式文件一样工作。
按照 this 说明进行操作。
之后,上面提到的 C# 中的两种方法都有效。
我在注册表中注册了一个名为 .appfolder 的快捷方式文件扩展名:reg export
它的行为应该像一个普通的 .lnk 快捷方式,但必须以 .appfolder 结尾(这是有原因的)。
现在我想在 C# 中以编程方式使用该文件 ending/extension 创建快捷方式。 .lnk 的默认结尾适用于:
public static void CreateShortcut(string shortcutName, string shortcutPath, string targetFileLocation)
{
string shortcutLocation = Path.Combine(shortcutPath, shortcutName + @".lnk");
WshShell shell = new WshShell();
IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut(shortcutLocation);
shortcut.Description = "My shortcut description";
shortcut.TargetPath = targetFileLocation;
shortcut.Save();
}
//e.g:
CreateShortcut("Example (Notepad)", Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
"notepad.exe");
当我尝试将此行 string shortcutLocation = Path.Combine(shortcutPath, shortcutName + @".lnk");
中的文件扩展名更改为 .appfolder 时,我得到一个 System.Runtime.InteropServices.COMException
(HRESULT: 0x80020009 (DISP_E_EXCEPTION)
).
当我尝试使用 File.Move(shortcutLocation, Path.ChangeExtension(shortcutLocation, ".appfolder"));
在 creating/saving 快捷方式后更改文件扩展名时,我在桌面上得到一个具有以下属性的文件:image
如您所见,Windows 确实将 .appfolder 扩展名识别为快捷方式,但是缺少 'Shortcut' 选项卡,当我双击文件执行时,没有任何反应。
所以,我的 .appfolder 注册不完整,虽然它应该是......或者如何在 C# 中以编程方式创建具有自己的快捷方式文件扩展名的快捷方式?
感谢您的帮助 ;)
编辑:
我尝试了另一种以编程方式创建快捷方式的方法:
void main() {
IShellLink link = (IShellLink)new ShellLink();
// setup shortcut information
link.SetDescription("My Description");
link.SetPath(@"notepad.exe");
// save it
IPersistFile file = (IPersistFile)link;
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
file.Save(Path.Combine(desktopPath, "Notepad.appfolder"), false);
}
[ComImport]
[Guid("00021401-0000-0000-C000-000000000046")]
internal class ShellLink
{
}
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214F9-0000-0000-C000-000000000046")]
internal interface IShellLink
{
void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd, int fFlags);
void GetIDList(out IntPtr ppidl);
void SetIDList(IntPtr pidl);
void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
void GetHotkey(out short pwHotkey);
void SetHotkey(short wHotkey);
void GetShowCmd(out int piShowCmd);
void SetShowCmd(int iShowCmd);
void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cchIconPath, out int piIcon);
void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
void Resolve(IntPtr hwnd, int fFlags);
void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
}
创建快捷方式文件没有任何错误(如System.Runtime.InteropServices.COMException
,见上),但它不通过双击执行.exe文件。
我解决了: 我对 .appfolder 的注册并不完全正确,无法像 .lnk 快捷方式文件一样工作。 按照 this 说明进行操作。 之后,上面提到的 C# 中的两种方法都有效。