Files
PDFPatcher/App/Common/ShortcutFile.cs
T
2021-12-24 20:35:03 +08:00

116 lines
4.4 KiB
C#

using System;
using System.Text;
using System.Runtime.InteropServices;
namespace PDFPatcher.Common
{
/// <summary>用于创建或管理快捷方式文件的类。</summary>
public sealed class ShortcutFile
{
readonly IShellLink _link;
/// <summary>获取或设置快捷方式的目标路径。</summary>
public string Destination { get; private set; }
/// <summary>获取或设置快捷方式的工作目录。</summary>
public string WorkingDirectory { get; set; }
/// <summary>获取或设置快捷方式的描述文本。</summary>
public string Description { get; set; }
/// <summary>获取或设置快捷方式的启动参数。</summary>
public string Arguments { get; set; }
/// <summary>获取或设置快捷方式的图标文件位置。</summary>
public string IconLocation { get; set; }
/// <summary>获取或设置快捷方式的图标文件索引。</summary>
public int IconIndex { get; set; }
private ShortcutFile () {
_link = (IShellLink)new ShellLink();
}
/// <summary>创建快捷方式。</summary>
/// <param name="destination">快捷方式指向的目标文件路径。</param>
public ShortcutFile (string destination) {
_link = (IShellLink)new ShellLink ();
Destination = destination;
_link.SetPath (destination);
}
/// <summary>加载快捷方式。</summary>
/// <param name="shortcutFilePath">快捷方式文件的位置。</param>
/// <returns><see cref="ShortcutFile"/> 实例。</returns>
public static ShortcutFile Load (string shortcutFilePath) {
var s = new ShortcutFile ();
var l = s._link;
var file = (System.Runtime.InteropServices.ComTypes.IPersistFile)s._link;
file.Load (shortcutFilePath, 0);
s.Destination = shortcutFilePath;
var sb = new StringBuilder ();
l.GetDescription (sb, 512);
s.Description = sb.ToString ();
sb.Length = 0;
l.GetWorkingDirectory (sb, 256);
s.WorkingDirectory = sb.ToString ();
int ii;
sb.Length = 0;
l.GetIconLocation (sb, 256, out ii);
s.IconLocation = sb.ToString ();
sb.Length = 0;
l.GetArguments (sb, 256);
s.Arguments = sb.ToString ();
return s;
}
/// <summary>将快捷方式保存到目标位置。</summary>
/// <param name="position">快捷方式文件的位置。</param>
public void Save (string position) {
if (String.IsNullOrEmpty (WorkingDirectory) == false) {
_link.SetWorkingDirectory (WorkingDirectory);
}
if (String.IsNullOrEmpty (Description) == false) {
_link.SetDescription (Description);
}
if (String.IsNullOrEmpty (Arguments) == false) {
_link.SetArguments (Arguments);
}
if (String.IsNullOrEmpty (IconLocation) == false) {
_link.SetIconLocation (IconLocation, IconIndex >= 0 ? IconIndex : 0);
}
var file = (System.Runtime.InteropServices.ComTypes.IPersistFile)_link;
file.Save (position, false);
}
#region COM Interops
[ComImport]
[Guid ("00021401-0000-0000-C000-000000000046")]
class ShellLink
{
}
[ComImport]
[InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
[Guid ("000214F9-0000-0000-C000-000000000046")]
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);
}
#endregion
}
}