annotate ShortcutKeyFinder/Shortcut.cs @ 0:209d9210c18f default tip

It works.
author Brad Greco <brad@bgreco.net>
date Sat, 25 Jun 2016 13:42:54 +1000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
1 using System;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
2 using System.ComponentModel;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
3 using System.Drawing;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
4 using System.IO;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
5
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
6 namespace ShortcutKeyFinder
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
7 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
8 /// <summary>Class to perform operations on shortcut (.lnk) files</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
9 class Shortcut : INotifyPropertyChanged
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
10 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
11 private bool _hasDuplicateHotkey;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
12 private Hotkey _hotkey;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
13 public event PropertyChangedEventHandler PropertyChanged;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
14
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
15 /// <summary>Name of the shortcut as displayed by Windows Explorer</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
16 /// <remarks>Not necessarily the same as the shortcut's filename</remarks>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
17 public string Name { get; private set; }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
18
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
19 /// <summary>Full path of the shortcut file</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
20 public string Path { get; private set; }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
21
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
22 /// <summary>Full path of the shortcut's parent directory</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
23 public string Location
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
24 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
25 get { return System.IO.Path.GetDirectoryName(Path); }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
26 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
27
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
28 /// <summary>Display name of the shortcut's parent directory</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
29 /// <remarks>Gives the user a general idea of where the shortcut is located rather than the full path</remarks>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
30 public string DisplayLocation
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
31 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
32 get {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
33 return Location
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
34 .Replace(Environment.GetFolderPath(Environment.SpecialFolder.StartMenu), "Start Menu")
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
35 .Replace(Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu), "Start Menu")
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
36 .Replace(Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), "Desktop")
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
37 .Replace(Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory), "Desktop");
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
38 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
39
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
40 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
41
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
42 /// <summary>Hotkey associated with the shortcut</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
43 public Hotkey Hotkey
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
44 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
45 get { return _hotkey; }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
46 set
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
47 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
48 if (value != _hotkey)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
49 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
50 _hotkey = value;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
51 NotifyPropertyChanged("Hotkey");
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
52 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
53 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
54 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
55
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
56 /// <summary>Icon associated with the shortcut</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
57 public Image Icon { get; private set; }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
58
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
59 /// <summary>Indicates whether this shortcut's hotkey is the same as that of another shortcut</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
60 /// <remarks>Always false unless set to true by some other class</remarks>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
61 public bool HasDuplicateHotkey
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
62 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
63 get { return _hasDuplicateHotkey; }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
64 set
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
65 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
66 if (value != _hasDuplicateHotkey)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
67 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
68 _hasDuplicateHotkey = value;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
69 NotifyPropertyChanged("HasDuplicateHotkey");
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
70 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
71 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
72 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
73
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
74 /// <summary>Indicates whether the user has permissions to modify the shortcut</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
75 /// <remarks>Always false unless set to true by some other class</remarks>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
76 public bool ReadOnly { get; set; }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
77
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
78 /// <summary>Constructor</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
79 /// <param name="path">Full path to a shortcut (.lnk) file</param>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
80 public Shortcut(string path)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
81 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
82 Path = path;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
83 LoadShortcutInfo();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
84 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
85
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
86 /// <summary>Implements the <see cref="INotifyPropertyChanged"/> interface</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
87 private void NotifyPropertyChanged(String info)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
88 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
89 if (PropertyChanged != null)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
90 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
91 PropertyChanged(this, new PropertyChangedEventArgs(info));
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
92 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
93 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
94
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
95 /// <summary>Constructor</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
96 private void LoadShortcutInfo()
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
97 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
98 ushort hotkey = Win32Helpers.GetShortcutHotkey(Path);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
99 if (hotkey != 0)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
100 Hotkey = new Hotkey(hotkey);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
101 FileInfo info = Win32Helpers.GetFileInfo(Path, true, true);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
102 if (info != null)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
103 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
104 Name = info.DisplayName;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
105 Icon = info.Icon.ToBitmap();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
106 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
107 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
108
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
109 /// <summary>Shows the Windows Explorer properties window for the shortcut</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
110 /// <param name="parentWindow">Optional handle to a parent window for use when displaying error messages</param>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
111 public void ShowExplorerPropertiesWindow(IntPtr parentWindow = default(IntPtr))
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
112 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
113 Win32Helpers.ShowFilePropertiesWindow(Path, parentWindow);
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
114 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
115
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
116 /// <summary>Writes the shortcut data to disk</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
117 public void Save()
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
118 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
119 if (!Win32Helpers.SetShortcutHotkey(Path, Hotkey != null ? Hotkey.RawHotkey : (ushort)0))
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
120 throw new UnauthorizedAccessException();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
121 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
122
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
123 /// <summary>Determine whether two shortcuts are the same file</summary>
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
124 public override bool Equals(object obj)
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
125 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
126 Shortcut shortcut = obj as Shortcut;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
127 return shortcut != null && shortcut.Path == Path;
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
128 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
129
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
130 public override int GetHashCode()
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
131 {
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
132 return Path.GetHashCode();
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
133 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
134 }
209d9210c18f It works.
Brad Greco <brad@bgreco.net>
parents:
diff changeset
135 }