diff --git a/.gitignore b/.gitignore index bd3ce63..2c785cb 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ obj/ bin/ Backup/ +Extra/ NSISInstaller/Files/* NSISInstaller/Output/* *.ncb diff --git a/Common/pinapp.png b/Common/pinapp.png new file mode 100644 index 0000000..7425a69 Binary files /dev/null and b/Common/pinapp.png differ diff --git a/Common/unpinapp.png b/Common/unpinapp.png new file mode 100644 index 0000000..0aeb32a Binary files /dev/null and b/Common/unpinapp.png differ diff --git a/Libraries/ShellLink/App.ico b/Libraries/ShellLink/App.ico new file mode 100644 index 0000000..293d0d2 Binary files /dev/null and b/Libraries/ShellLink/App.ico differ diff --git a/Libraries/ShellLink/AssemblyInfo.cs b/Libraries/ShellLink/AssemblyInfo.cs new file mode 100644 index 0000000..9f89a32 --- /dev/null +++ b/Libraries/ShellLink/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.*")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +[assembly: AssemblyDelaySign(false)] +[assembly: AssemblyKeyFile("")] +[assembly: AssemblyKeyName("")] diff --git a/Libraries/ShellLink/AutoCompleteTextBox.cs b/Libraries/ShellLink/AutoCompleteTextBox.cs new file mode 100644 index 0000000..fc61d45 --- /dev/null +++ b/Libraries/ShellLink/AutoCompleteTextBox.cs @@ -0,0 +1,120 @@ +using System; +using System.Windows.Forms; +using System.Runtime.InteropServices; + +namespace vbAccelerator.Controls.TextBox +{ + /// + /// Adds Shell File System and URL AutoCompletion facilities to + /// a text box + /// + public class AutoCompleteTextBox : System.Windows.Forms.TextBox + { + #region Unmanaged Code + [Flags] + public enum SHAutoCompleteFlags : uint + { + SHACF_DEFAULT = 0x0, // Currently (SHACF_FILESYSTEM | SHACF_URLALL) + SHACF_FILESYSTEM = 0x1, // This includes the File System as well as the rest of the shell (Desktop\My Computer\Control Panel\) + SHACF_URLHISTORY = 0x2, // URLs in the User's History + SHACF_URLMRU = 0x4, // URLs in the User's Recently Used list. + SHACF_USETAB = 0x8, // Use the tab to move thru the autocomplete possibilities instead of to the next dialog/window control. + SHACF_URLALL = (SHACF_URLHISTORY | SHACF_URLMRU), + SHACF_FILESYS_ONLY = 0x10, // This includes the File System + SHACF_FILESYS_DIRS = 0x20, // Same as SHACF_FILESYS_ONLY except it only includes directories, UNC servers, and UNC server shares. + SHACF_AUTOSUGGEST_FORCE_ON = 0x10000000, // Ignore the registry default and force the feature on. + SHACF_AUTOSUGGEST_FORCE_OFF = 0x20000000, // Ignore the registry default and force the feature off. + SHACF_AUTOAPPEND_FORCE_ON = 0x40000000, // Ignore the registry default and force the feature on. (Also know as AutoComplete) + SHACF_AUTOAPPEND_FORCE_OFF = 0x80000000 // Ignore the registry default and force the feature off. (Also know as AutoComplete) + } + + [DllImport("shlwapi.dll")] + private static extern int SHAutoComplete ( + IntPtr hwndEdit, + AutoCompleteTextBox.SHAutoCompleteFlags dwFlags ); + + #endregion + + #region Member Variables + private AutoCompleteTextBox.SHAutoCompleteFlags autoCompleteFlags = + SHAutoCompleteFlags.SHACF_FILESYS_ONLY; + private bool flagsSet = false; + private bool handleCreated = false; + #endregion + + #region Implementation + + /// + /// Gets/sets the flags controlling automcompletion for the + /// text box + /// + public AutoCompleteTextBox.SHAutoCompleteFlags AutoCompleteFlags + { + get + { + return this.autoCompleteFlags; + } + set + { + this.autoCompleteFlags = value; + this.flagsSet = true; + if (handleCreated) + { + SetAutoComplete(); + } + } + } + + protected override void OnHandleCreated ( System.EventArgs e ) + { + // call this first as SHAutoComplete may not be supported + // on the OS + base.OnHandleCreated(e); + // don't do anything if we're in design mode: + if (!this.DesignMode) + { + // remember we've created the handle for any future + // get/ set + handleCreated = true; + + // if we've provided some flags then start autocompletion: + if (flagsSet) + { + SetAutoComplete(); + } + } + } + + private void SetAutoComplete() + { + SHAutoComplete(this.Handle, this.autoCompleteFlags); + } + + /// + /// Constructs an auto-complete capable text box but + /// does not automatically start auto-completion. + /// + public AutoCompleteTextBox() : base() + { + } + + /// + /// Constructs an auto-complete capable text box and + /// starts auto-completion with the specified flags. + /// + /// Flags controlling + /// auto-completion + public AutoCompleteTextBox( + AutoCompleteTextBox.SHAutoCompleteFlags autoCompleteFlags + ) : this() + { + // Handle will not be available at this point; we need + // to wait for HandleCreated: + this.autoCompleteFlags = autoCompleteFlags; + this.flagsSet = true; + } + + #endregion + } +} + diff --git a/Libraries/ShellLink/AutoCompleteTextBox.resx b/Libraries/ShellLink/AutoCompleteTextBox.resx new file mode 100644 index 0000000..7e32396 --- /dev/null +++ b/Libraries/ShellLink/AutoCompleteTextBox.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/Libraries/ShellLink/FileIcon.cs b/Libraries/ShellLink/FileIcon.cs new file mode 100644 index 0000000..a3b2366 --- /dev/null +++ b/Libraries/ShellLink/FileIcon.cs @@ -0,0 +1,245 @@ +using System; +using System.Runtime.InteropServices; +using System.Drawing; + +namespace vbAccelerator.Components.Shell +{ + /// + /// Enables extraction of icons for any file type from + /// the Shell. + /// + public class FileIcon + { + + #region UnmanagedCode + private const int MAX_PATH = 260; + + [StructLayout(LayoutKind.Sequential)] + private struct SHFILEINFO + { + public IntPtr hIcon; + public int iIcon; + public int dwAttributes; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst=MAX_PATH)] + public string szDisplayName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst=80)] + public string szTypeName; + } + + [DllImport("shell32")] + private static extern int SHGetFileInfo ( + string pszPath, + int dwFileAttributes, + ref SHFILEINFO psfi, + uint cbFileInfo, + uint uFlags); + + [DllImport("user32.dll")] + private static extern int DestroyIcon(IntPtr hIcon); + + private const int FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x100; + private const int FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x2000; + private const int FORMAT_MESSAGE_FROM_HMODULE = 0x800; + private const int FORMAT_MESSAGE_FROM_STRING = 0x400; + private const int FORMAT_MESSAGE_FROM_SYSTEM = 0x1000; + private const int FORMAT_MESSAGE_IGNORE_INSERTS = 0x200; + private const int FORMAT_MESSAGE_MAX_WIDTH_MASK = 0xFF; + [DllImport("kernel32")] + private extern static int FormatMessage ( + int dwFlags, + IntPtr lpSource, + int dwMessageId, + int dwLanguageId, + string lpBuffer, + uint nSize, + int argumentsLong); + + [DllImport("kernel32")] + private extern static int GetLastError(); + #endregion + + #region Member Variables + private string fileName; + private string displayName; + private string typeName; + private SHGetFileInfoConstants flags; + private Icon fileIcon; + #endregion + + #region Enumerations + [Flags] + public enum SHGetFileInfoConstants : int + { + SHGFI_ICON = 0x100, // get icon + SHGFI_DISPLAYNAME = 0x200, // get display name + SHGFI_TYPENAME = 0x400, // get type name + SHGFI_ATTRIBUTES = 0x800, // get attributes + SHGFI_ICONLOCATION = 0x1000, // get icon location + SHGFI_EXETYPE = 0x2000, // return exe type + SHGFI_SYSICONINDEX = 0x4000, // get system icon index + SHGFI_LINKOVERLAY = 0x8000, // put a link overlay on icon + SHGFI_SELECTED = 0x10000, // show icon in selected state + SHGFI_ATTR_SPECIFIED = 0x20000, // get only specified attributes + SHGFI_LARGEICON = 0x0, // get large icon + SHGFI_SMALLICON = 0x1, // get small icon + SHGFI_OPENICON = 0x2, // get open icon + SHGFI_SHELLICONSIZE = 0x4, // get shell size icon + //SHGFI_PIDL = 0x8, // pszPath is a pidl + SHGFI_USEFILEATTRIBUTES = 0x10, // use passed dwFileAttribute + SHGFI_ADDOVERLAYS = 0x000000020, // apply the appropriate overlays + SHGFI_OVERLAYINDEX = 0x000000040 // Get the index of the overlay + } + #endregion + + #region Implementation + /// + /// Gets/sets the flags used to extract the icon + /// + public FileIcon.SHGetFileInfoConstants Flags + { + get + { + return flags; + } + set + { + flags = value; + } + } + + /// + /// Gets/sets the filename to get the icon for + /// + public string FileName + { + get + { + return fileName; + } + set + { + fileName = value; + } + } + + /// + /// Gets the icon for the chosen file + /// + public Icon ShellIcon + { + get + { + return fileIcon; + } + } + + /// + /// Gets the display name for the selected file + /// if the SHGFI_DISPLAYNAME flag was set. + /// + public string DisplayName + { + get + { + return displayName; + } + } + + /// + /// Gets the type name for the selected file + /// if the SHGFI_TYPENAME flag was set. + /// + public string TypeName + { + get + { + return typeName; + } + } + + /// + /// Gets the information for the specified + /// file name and flags. + /// + public void GetInfo() + { + fileIcon = null; + typeName = ""; + displayName = ""; + + SHFILEINFO shfi = new SHFILEINFO(); + uint shfiSize = (uint)Marshal.SizeOf(shfi.GetType()); + + int ret = SHGetFileInfo( + fileName, 0, ref shfi, shfiSize, (uint)(flags)); + if (ret != 0) + { + if (shfi.hIcon != IntPtr.Zero) + { + fileIcon = System.Drawing.Icon.FromHandle(shfi.hIcon); + // Now owned by the GDI+ object + //DestroyIcon(shfi.hIcon); + } + typeName = shfi.szTypeName; + displayName = shfi.szDisplayName; + } + else + { + + int err = GetLastError(); + Console.WriteLine("Error {0}", err); + string txtS = new string('\0', 256); + int len = FormatMessage( + FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + IntPtr.Zero, err, 0, txtS, 256, 0); + Console.WriteLine("Len {0} text {1}", len, txtS); + + // throw exception + + } + } + + /// + /// Constructs a new, default instance of the FileIcon + /// class. Specify the filename and call GetInfo() + /// to retrieve an icon. + /// + public FileIcon() + { + flags = SHGetFileInfoConstants.SHGFI_ICON | + SHGetFileInfoConstants.SHGFI_DISPLAYNAME | + SHGetFileInfoConstants.SHGFI_TYPENAME | + SHGetFileInfoConstants.SHGFI_ATTRIBUTES | + SHGetFileInfoConstants.SHGFI_EXETYPE; + } + /// + /// Constructs a new instance of the FileIcon class + /// and retrieves the icon, display name and type name + /// for the specified file. + /// + /// The filename to get the icon, + /// display name and type name for + public FileIcon(string fileName) : this() + { + this.fileName = fileName; + GetInfo(); + } + /// + /// Constructs a new instance of the FileIcon class + /// and retrieves the information specified in the + /// flags. + /// + /// The filename to get information + /// for + /// The flags to use when extracting the + /// icon and other shell information. + public FileIcon(string fileName, FileIcon.SHGetFileInfoConstants flags) + { + this.fileName = fileName; + this.flags = flags; + GetInfo(); + } + + #endregion + } +} \ No newline at end of file diff --git a/Libraries/ShellLink/IconMenuLib.cs b/Libraries/ShellLink/IconMenuLib.cs new file mode 100644 index 0000000..61976f2 --- /dev/null +++ b/Libraries/ShellLink/IconMenuLib.cs @@ -0,0 +1,479 @@ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Windows.Forms; + +namespace vbAccelerator.Components.Menu +{ + + public class IconMenuItem : MenuItem + { + private string m_tag = ""; + private Font m_font = null; + private int m_iconIndex = -1; + + private int iconWidth = 24; + private int iconToTextSeparatorWidth = 7; + private int textToEdgeSeparatorWidth = 16; + + public Font Font + { + get + { + return m_font; + } + set + { + m_font = value; + } + } + + public string Tag + { + get + { + return m_tag; + } + set + { + m_tag = value; + } + } + + public int IconIndex + { + get + { + return m_iconIndex; + } + set + { + m_iconIndex = value; + } + } + + private void DrawCaption(Graphics gfx, string text, Brush brush, + RectangleF layoutRect, bool showAccelerator, bool shortCut, bool isEnabled) + { + System.Drawing.StringFormat sf = new System.Drawing.StringFormat(); + sf.FormatFlags = StringFormatFlags.NoWrap; + sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Hide; + sf.LineAlignment = StringAlignment.Center; + if (showAccelerator) + { + sf.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show; + } + if (shortCut) + { + SizeF size = gfx.MeasureString(text, m_font); + layoutRect.X = layoutRect.Width - size.Width - textToEdgeSeparatorWidth; + sf.Alignment = StringAlignment.Near; + } + else + { + sf.Alignment = StringAlignment.Near; + } + if (isEnabled) + { + gfx.DrawString(text, m_font, brush, layoutRect, sf); + } + else + { + Brush disabledBrush = SystemBrushes.ControlDark; + gfx.DrawString(text, m_font, disabledBrush , layoutRect, sf); + //ControlPaint.DrawStringDisabled(gfx, text, m_font, + // Color.FromKnownColor(KnownColor.ControlDark), layoutRect, sf); + } + } + + private void DrawIcon(Graphics gfx, Rectangle rect, + bool isSelected, bool isChecked, bool isRadioChecked, bool isEnabled) + { + System.Windows.Forms.ImageList iconImageList = null; + + IconMainMenu m = (IconMainMenu)this.GetMainMenu(); + if (m != null) + { + iconImageList = m.IconImageList; + } + else + { + IconContextMenu c = (IconContextMenu)this.GetContextMenu(); + if (c != null) + { + iconImageList = c.IconImageList; + } + } + + bool hasIcon = false; + if (iconImageList != null) + { + if ((m_iconIndex >= 0) && (m_iconIndex < iconImageList.Images.Count)) + { + hasIcon = true; + + int x = rect.Left + (iconWidth- iconImageList.ImageSize.Width)/2; + int y = rect.Top + (rect.Height - iconImageList.ImageSize.Height)/2; + + if ((isSelected) && (isEnabled)) + { + // draw icon as a shadow here + ControlPaint.DrawImageDisabled(gfx, + iconImageList.Images[m_iconIndex], + x, y, Color.FromKnownColor(KnownColor.Control)); + x-=1; + y-=1; + } + if (isEnabled) + { + iconImageList.Draw(gfx, x, y, + iconImageList.ImageSize.Width, iconImageList.ImageSize.Height, m_iconIndex); + } + else + { + ControlPaint.DrawImageDisabled(gfx, + iconImageList.Images[m_iconIndex], + x, y, Color.FromKnownColor(KnownColor.Control)); + } + } + } + + if (isChecked) + { + Rectangle checkRect = rect; + checkRect.Width = iconWidth; + checkRect.Inflate(-1,-1); + checkRect.Height -= 1; + Pen pen = SystemPens.Highlight; + gfx.DrawRectangle(pen, checkRect); + if (!hasIcon) + { + int x = rect.Left + (iconWidth- SystemInformation.MenuCheckSize.Width)/2; + int y = rect.Top + (rect.Height - SystemInformation.MenuCheckSize.Width)/2; + + // Fill the background of the check item with an alpha-blended + // highlight colour: + int alpha = 24; + if (isSelected) + { + alpha = 128; + } + Brush br = new SolidBrush(Color.FromArgb(alpha, Color.FromKnownColor(KnownColor.Highlight))); + gfx.FillRectangle(br, checkRect); + br.Dispose(); + + // create a new bitmap to draw the menu glyph onto: + Bitmap bm = new Bitmap(SystemInformation.MenuCheckSize.Width, SystemInformation.MenuCheckSize.Height); + Graphics gr = Graphics.FromImage(bm); + if (isRadioChecked) + { + // draw radio option + ControlPaint.DrawMenuGlyph(gr, 0, 0, + bm.Width, bm.Height, + MenuGlyph.Bullet); + } + else + { + // draw check mark + ControlPaint.DrawMenuGlyph(gr, 0, 0, + bm.Width, bm.Height, + MenuGlyph.Checkmark); + } + Rectangle outRect = new Rectangle(x, y, bm.Width, bm.Height); + // Draw the menu glyph transparently: + ImageAttributes imgAttr = new ImageAttributes(); + imgAttr.SetColorKey(bm.GetPixel(0,0), bm.GetPixel(0,0), ColorAdjustType.Default); + gfx.DrawImage(bm, outRect, 0, 0, bm.Width, bm.Height, GraphicsUnit.Pixel, imgAttr); + imgAttr.Dispose(); + bm.Dispose(); + gr.Dispose(); + } + } + + } + + protected override void OnDrawItem ( System.Windows.Forms.DrawItemEventArgs e ) + { + if (this.Parent == this.GetMainMenu()) + { + Brush brush; + brush = SystemBrushes.Control; + e.Graphics.FillRectangle(brush, e.Bounds); + if ( + ((e.State & DrawItemState.Selected) == DrawItemState.Selected) || + ((e.State & DrawItemState.HotLight) == DrawItemState.HotLight) + ) + { + + Rectangle highlightRect = e.Bounds; + highlightRect.X += 1; + highlightRect.Y += 1; + highlightRect.Width -= 3; + + Pen pen = SystemPens.Highlight; + if ((e.State & DrawItemState.HotLight) == DrawItemState.HotLight) + { + highlightRect.Height -= 2; + brush = new SolidBrush(HighlightBrushColor()); + e.Graphics.FillRectangle(brush, highlightRect); + brush.Dispose(); + + e.Graphics.DrawRectangle(pen, highlightRect); + } + else + { + highlightRect.X -= 1; + + highlightRect.Height -= 1; + brush = SystemBrushes.Control; + e.Graphics.FillRectangle(brush, highlightRect); + + highlightRect.Height -= 1; + highlightRect.Width -= 1; + pen = SystemPens.ControlDark; + e.Graphics.DrawLine(pen, highlightRect.X, highlightRect.Y + highlightRect.Height, highlightRect.X, highlightRect.Y); + e.Graphics.DrawLine(pen, highlightRect.X, highlightRect.Y, highlightRect.X + highlightRect.Width, highlightRect.Y); + e.Graphics.DrawLine(pen, highlightRect.X + highlightRect.Width, highlightRect.Y, highlightRect.X + highlightRect.Width, highlightRect.Y + highlightRect.Height); + + //pen = SystemPens.ControlDark; + pen = new Pen(Color.FromArgb(128, Color.Black)); + e.Graphics.DrawLine(pen, + highlightRect.X + highlightRect.Width + 1, + highlightRect.Y + 4, + highlightRect.X + highlightRect.Width + 1, + highlightRect.Y + highlightRect.Height); + pen.Dispose(); + //pen = SystemPens.ControlDarkDark; + pen = new Pen(Color.FromArgb(64, Color.Black)); + e.Graphics.DrawLine(pen, + highlightRect.X + highlightRect.Width + 2, + highlightRect.Y + 4, + highlightRect.X + highlightRect.Width + 2, + highlightRect.Y + highlightRect.Height); + pen.Dispose(); + pen = new Pen(Color.FromArgb(32, Color.Black)); + e.Graphics.DrawLine(pen, + highlightRect.X + highlightRect.Width + 3, + highlightRect.Y + 5, + highlightRect.X + highlightRect.Width + 3, + highlightRect.Y + highlightRect.Height); + pen.Dispose(); + } + + } + brush = SystemBrushes.WindowText; + RectangleF layoutRect = new RectangleF(e.Bounds.X + 1, e.Bounds.Y + 1, e.Bounds.Width - 2, e.Bounds.Height); + layoutRect.X += 4; + DrawCaption(e.Graphics, this.Text, brush, layoutRect, + ((e.State & DrawItemState.NoAccelerator) != DrawItemState.NoAccelerator ), + false, this.Enabled); + } + else + { + Brush iconBarBrush = SystemBrushes.Control; + e.Graphics.FillRectangle(iconBarBrush, e.Bounds.X, e.Bounds.Y, + iconWidth, e.Bounds.Height); + + Rectangle rectOut = e.Bounds; + + if (this.Text.Equals("-")) + { + rectOut.X += iconWidth; + Brush brush; + if (System.Environment.OSVersion.Version.Major > 4) + { + brush = SystemBrushes.Menu; + } + else + { + brush = SystemBrushes.Window; + } + e.Graphics.FillRectangle(brush, rectOut); + + Pen pen = SystemPens.ControlDark; + e.Graphics.DrawLine(pen, + iconWidth + iconToTextSeparatorWidth, e.Bounds.Y + 1, + e.Bounds.Width, e.Bounds.Y + 1); + } + else + { + Rectangle rectIn = rectOut; + Brush brush; + rectIn.Height -= 1; + if ( + ((e.State & DrawItemState.Selected) == DrawItemState.Selected) && + (this.Enabled)) + + { + if (System.Environment.OSVersion.Version.Major > 4) + { + brush = SystemBrushes.Menu; + } + else + { + brush = SystemBrushes.Window; + } + e.Graphics.FillRectangle(brush, rectIn); + brush = new SolidBrush(Color.FromArgb(64, Color.FromKnownColor(KnownColor.Highlight))); + e.Graphics.FillRectangle(brush, rectIn); + brush.Dispose(); + + Pen pen = SystemPens.Highlight; + Rectangle highlightRect = rectIn; + highlightRect.Width -= 1; + e.Graphics.DrawRectangle(pen, highlightRect); + } + else + { + rectOut.X += iconWidth; + rectOut.Width -= iconWidth; + if (System.Environment.OSVersion.Version.Major > 4) + { + brush = SystemBrushes.Menu; + } + else + { + brush = SystemBrushes.Window; + } + e.Graphics.FillRectangle(brush, rectOut); + } + + DrawIcon( + e.Graphics, e.Bounds, + ((e.State & DrawItemState.Selected)==DrawItemState.Selected), + this.Checked, this.RadioCheck, this.Enabled); + + brush = SystemBrushes.WindowText; + RectangleF layoutRect = new RectangleF(e.Bounds.X + iconWidth + iconToTextSeparatorWidth, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height); + DrawCaption(e.Graphics, this.Text, brush, layoutRect, + ((e.State & DrawItemState.NoAccelerator) != DrawItemState.NoAccelerator), + false, this.Enabled); + + if (this.ShowShortcut) + { + if (this.Shortcut != Shortcut.None) + { + string shortCut = ShortcutToString(this.Shortcut); + DrawCaption(e.Graphics, shortCut, brush, layoutRect, false, true, this.Enabled); + } + } + } + } + } + + protected override void OnMeasureItem ( System.Windows.Forms.MeasureItemEventArgs e ) + { + if (this.Parent == this.GetMainMenu()) + { + SizeF fontSize = e.Graphics.MeasureString(this.Text.Replace("&",""), this.Font); + e.ItemWidth = (int)fontSize.Width + 3; + e.ItemHeight = (int)fontSize.Height; + } + else + { + Size size = new Size(iconWidth + iconToTextSeparatorWidth + textToEdgeSeparatorWidth, 3); + if (!this.Text.Equals("-")) + { + string toMeasure = this.Text; + if (this.ShowShortcut) + { + if (this.Shortcut != Shortcut.None) + { + toMeasure += " " + ShortcutToString(this.Shortcut); + } + } + SizeF fontSize = e.Graphics.MeasureString(toMeasure, this.Font); + size.Width += (int)fontSize.Width; + size.Height = Math.Max(iconWidth, (int)fontSize.Height); + } + e.ItemHeight = size.Height; + e.ItemWidth = size.Width; + } + } + + private Color HighlightBrushColor() + { + //return Color.FromArgb(192, Color.FromKnownColor(KnownColor.Highlight)); + Color cH = Color.FromKnownColor(KnownColor.Highlight); + Color cM; + if (System.Environment.OSVersion.Version.Major > 4) + { + cM = Color.FromKnownColor(KnownColor.Menu); + } + else + { + cM = Color.FromKnownColor(KnownColor.Window); + } + return Color.FromArgb( + Math.Max(0,Math.Min(255, cH.R + (cM.R - cH.R)/2)), + Math.Max(0,Math.Min(255, cH.G + (cM.G - cH.G)/2)), + Math.Max(0,Math.Min(255, cH.B + (cM.B - cH.B)/2))); + } + + private string ShortcutToString(Shortcut s) + { + string ret = s.ToString(); + ret = ret.Replace("Ctrl", "Ctrl+"); + ret = ret.Replace("Alt", "Alt+"); + ret = ret.Replace("Shift", "Shift+"); + return ret; + } + + public IconMenuItem() : base() + { + this.OwnerDraw = true; + m_font = SystemInformation.MenuFont; + } + } + + public class IconContextMenu : ContextMenu + { + private System.Windows.Forms.ImageList imgList; + + public System.Windows.Forms.ImageList IconImageList + { + get + { + return imgList; + } + set + { + imgList = value; + } + } + + public IconContextMenu() : base() + { + } + + public IconContextMenu( IconMenuItem[] items ) : base(items) + { + } + } + + public class IconMainMenu : MainMenu + { + private System.Windows.Forms.ImageList imgList; + + public System.Windows.Forms.ImageList IconImageList + { + get + { + return imgList; + } + set + { + imgList = value; + } + } + + public IconMainMenu() : base() + { + } + + public IconMainMenu ( IconMenuItem[] items ) : base(items) + { + } + } + +} diff --git a/Libraries/ShellLink/IconPickerListBox.cs b/Libraries/ShellLink/IconPickerListBox.cs new file mode 100644 index 0000000..6f2c730 --- /dev/null +++ b/Libraries/ShellLink/IconPickerListBox.cs @@ -0,0 +1,134 @@ +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace vbAccelerator.Controls.ListBox +{ + internal class UnManagedMethods + { + [DllImport("Shell32", CharSet=CharSet.Auto)] + internal extern static int ExtractIconEx ( + [MarshalAs(UnmanagedType.LPTStr)] + string lpszFile, + int nIconIndex, + IntPtr[] phIconLarge, + IntPtr[] phIconSmall, + int nIcons); + } + + /// + /// Summary description for IconPickerListBox. + /// + public class IconPickerListBox : System.Windows.Forms.ListBox + { + public enum IconPickerIconSize + { + large, + small // not implemented + } + + private IconPickerIconSize iconSize = IconPickerIconSize.large; + private System.Windows.Forms.ImageList ilsIcons = null; + + private void drawItem(System.Windows.Forms.DrawItemEventArgs e) + { + if ((e.State & DrawItemState.Selected) == DrawItemState.Selected) + { + e.Graphics.FillRectangle(SystemBrushes.Highlight, e.Bounds); + if (this.Focused) + { + e.DrawFocusRectangle(); + } + } + else + { + e.Graphics.FillRectangle(SystemBrushes.Window, e.Bounds); + } + ilsIcons.Draw(e.Graphics, + e.Bounds.Left + 2, + e.Bounds.Top + 2, + ilsIcons.ImageSize.Width, + ilsIcons.ImageSize.Height, + (int)this.Items[e.Index]); + } + + protected override void OnDrawItem ( System.Windows.Forms.DrawItemEventArgs e ) + { + if (base.DesignMode) + { + base.OnDrawItem(e); + } + else + { + if (e.Index>-1) + { + drawItem(e); + } + else + { + base.OnDrawItem(e); + } + } + } + + public IconPickerIconSize IconSize + { + get + { + return iconSize; + } + set + { + iconSize = value; + } + } + + public void LoadIcons(string file) + { + this.Items.Clear(); + ilsIcons.Images.Clear(); + + // Get number of icons: + int iconCount = UnManagedMethods.ExtractIconEx( + file, -1, null, null, 0); + if (iconCount > 0) + { + IntPtr[] hIcon = new IntPtr[iconCount]; + if (iconSize == IconPickerIconSize.large) + { + iconCount = UnManagedMethods.ExtractIconEx( + file, 0, hIcon, null, iconCount); + } + else + { + iconCount = UnManagedMethods.ExtractIconEx( + file, 0, null, hIcon, iconCount); + } + if (iconCount > 0) + { + for (int i = 0; i < iconCount; i++) + { + Icon icon = Icon.FromHandle(hIcon[i]); + ilsIcons.Images.Add(icon); + icon.Dispose(); + this.Items.Add(i); + } + } + } + } + + public IconPickerListBox() : base() + { + this.DrawMode = DrawMode.OwnerDrawFixed; + this.MultiColumn = true; + this.ColumnWidth = 36; + this.ItemHeight = 36; + this.HorizontalScrollbar = true; + + this.ilsIcons = new System.Windows.Forms.ImageList(); + ilsIcons.ColorDepth = ColorDepth.Depth32Bit; + ilsIcons.ImageSize = new System.Drawing.Size(32, 32); + } + } +} diff --git a/Libraries/ShellLink/IconPickerListBox.resx b/Libraries/ShellLink/IconPickerListBox.resx new file mode 100644 index 0000000..7e32396 --- /dev/null +++ b/Libraries/ShellLink/IconPickerListBox.resx @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.0.0.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3102.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + diff --git a/Libraries/ShellLink/ShellLink.cs b/Libraries/ShellLink/ShellLink.cs new file mode 100644 index 0000000..66d0e53 --- /dev/null +++ b/Libraries/ShellLink/ShellLink.cs @@ -0,0 +1,937 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Text; +using System.Windows.Forms; + +namespace vbAccelerator.Components.Shell +{ + #region ShellLink Object + /// + /// Summary description for ShellLink. + /// + public class ShellLink : IDisposable + { + #region ComInterop for IShellLink + + #region IPersist Interface + [ComImportAttribute()] + [GuidAttribute("0000010C-0000-0000-C000-000000000046")] + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + private interface IPersist + { + [PreserveSig] + //[helpstring("Returns the class identifier for the component object")] + void GetClassID(out Guid pClassID); + } + #endregion + + #region IPersistFile Interface + [ComImportAttribute()] + [GuidAttribute("0000010B-0000-0000-C000-000000000046")] + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + private interface IPersistFile + { + // can't get this to go if I extend IPersist, so put it here: + [PreserveSig] + void GetClassID(out Guid pClassID); + + //[helpstring("Checks for changes since last file write")] + void IsDirty(); + + //[helpstring("Opens the specified file and initializes the object from its contents")] + void Load( + [MarshalAs(UnmanagedType.LPWStr)] string pszFileName, + uint dwMode); + + //[helpstring("Saves the object into the specified file")] + void Save( + [MarshalAs(UnmanagedType.LPWStr)] string pszFileName, + [MarshalAs(UnmanagedType.Bool)] bool fRemember); + + //[helpstring("Notifies the object that save is completed")] + void SaveCompleted( + [MarshalAs(UnmanagedType.LPWStr)] string pszFileName); + + //[helpstring("Gets the current name of the file associated with the object")] + void GetCurFile( + [MarshalAs(UnmanagedType.LPWStr)] out string ppszFileName); + } + #endregion + + #region IShellLink Interface + [ComImportAttribute()] + [GuidAttribute("000214EE-0000-0000-C000-000000000046")] + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + private interface IShellLinkA + { + //[helpstring("Retrieves the path and filename of a shell link object")] + void GetPath( + [Out(), MarshalAs(UnmanagedType.LPStr)] StringBuilder pszFile, + int cchMaxPath, + ref _WIN32_FIND_DATAA pfd, + uint fFlags); + + //[helpstring("Retrieves the list of shell link item identifiers")] + void GetIDList(out IntPtr ppidl); + + //[helpstring("Sets the list of shell link item identifiers")] + void SetIDList(IntPtr pidl); + + //[helpstring("Retrieves the shell link description string")] + void GetDescription( + [Out(), MarshalAs(UnmanagedType.LPStr)] StringBuilder pszFile, + int cchMaxName); + + //[helpstring("Sets the shell link description string")] + void SetDescription( + [MarshalAs(UnmanagedType.LPStr)] string pszName); + + //[helpstring("Retrieves the name of the shell link working directory")] + void GetWorkingDirectory( + [Out(), MarshalAs(UnmanagedType.LPStr)] StringBuilder pszDir, + int cchMaxPath); + + //[helpstring("Sets the name of the shell link working directory")] + void SetWorkingDirectory( + [MarshalAs(UnmanagedType.LPStr)] string pszDir); + + //[helpstring("Retrieves the shell link command-line arguments")] + void GetArguments( + [Out(), MarshalAs(UnmanagedType.LPStr)] StringBuilder pszArgs, + int cchMaxPath); + + //[helpstring("Sets the shell link command-line arguments")] + void SetArguments( + [MarshalAs(UnmanagedType.LPStr)] string pszArgs); + + //[propget, helpstring("Retrieves or sets the shell link hot key")] + void GetHotkey(out short pwHotkey); + //[propput, helpstring("Retrieves or sets the shell link hot key")] + void SetHotkey(short pwHotkey); + + //[propget, helpstring("Retrieves or sets the shell link show command")] + void GetShowCmd(out uint piShowCmd); + //[propput, helpstring("Retrieves or sets the shell link show command")] + void SetShowCmd(uint piShowCmd); + + //[helpstring("Retrieves the location (path and index) of the shell link icon")] + void GetIconLocation( + [Out(), MarshalAs(UnmanagedType.LPStr)] StringBuilder pszIconPath, + int cchIconPath, + out int piIcon); + + //[helpstring("Sets the location (path and index) of the shell link icon")] + void SetIconLocation( + [MarshalAs(UnmanagedType.LPStr)] string pszIconPath, + int iIcon); + + //[helpstring("Sets the shell link relative path")] + void SetRelativePath( + [MarshalAs(UnmanagedType.LPStr)] string pszPathRel, + uint dwReserved); + + //[helpstring("Resolves a shell link. The system searches for the shell link object and updates the shell link path and its list of identifiers (if necessary)")] + void Resolve( + IntPtr hWnd, + uint fFlags); + + //[helpstring("Sets the shell link path and filename")] + void SetPath( + [MarshalAs(UnmanagedType.LPStr)] string pszFile); + } + + + [ComImportAttribute()] + [GuidAttribute("000214F9-0000-0000-C000-000000000046")] + [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + private interface IShellLinkW + { + //[helpstring("Retrieves the path and filename of a shell link object")] + void GetPath( + [Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, + int cchMaxPath, + ref _WIN32_FIND_DATAW pfd, + uint fFlags); + + //[helpstring("Retrieves the list of shell link item identifiers")] + void GetIDList(out IntPtr ppidl); + + //[helpstring("Sets the list of shell link item identifiers")] + void SetIDList(IntPtr pidl); + + //[helpstring("Retrieves the shell link description string")] + void GetDescription( + [Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, + int cchMaxName); + + //[helpstring("Sets the shell link description string")] + void SetDescription( + [MarshalAs(UnmanagedType.LPWStr)] string pszName); + + //[helpstring("Retrieves the name of the shell link working directory")] + void GetWorkingDirectory( + [Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, + int cchMaxPath); + + //[helpstring("Sets the name of the shell link working directory")] + void SetWorkingDirectory( + [MarshalAs(UnmanagedType.LPWStr)] string pszDir); + + //[helpstring("Retrieves the shell link command-line arguments")] + void GetArguments( + [Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, + int cchMaxPath); + + //[helpstring("Sets the shell link command-line arguments")] + void SetArguments( + [MarshalAs(UnmanagedType.LPWStr)] string pszArgs); + + //[propget, helpstring("Retrieves or sets the shell link hot key")] + void GetHotkey(out short pwHotkey); + //[propput, helpstring("Retrieves or sets the shell link hot key")] + void SetHotkey(short pwHotkey); + + //[propget, helpstring("Retrieves or sets the shell link show command")] + void GetShowCmd(out uint piShowCmd); + //[propput, helpstring("Retrieves or sets the shell link show command")] + void SetShowCmd(uint piShowCmd); + + //[helpstring("Retrieves the location (path and index) of the shell link icon")] + void GetIconLocation( + [Out(), MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, + int cchIconPath, + out int piIcon); + + //[helpstring("Sets the location (path and index) of the shell link icon")] + void SetIconLocation( + [MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, + int iIcon); + + //[helpstring("Sets the shell link relative path")] + void SetRelativePath( + [MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, + uint dwReserved); + + //[helpstring("Resolves a shell link. The system searches for the shell link object and updates the shell link path and its list of identifiers (if necessary)")] + void Resolve( + IntPtr hWnd, + uint fFlags); + + //[helpstring("Sets the shell link path and filename")] + void SetPath( + [MarshalAs(UnmanagedType.LPWStr)] string pszFile); + } + #endregion + + #region ShellLinkCoClass + [GuidAttribute("00021401-0000-0000-C000-000000000046")] + [ClassInterfaceAttribute(ClassInterfaceType.None)] + [ComImportAttribute()] + private class CShellLink{} + + #endregion + + #region Private IShellLink enumerations + private enum EShellLinkGP : uint + { + SLGP_SHORTPATH = 1, + SLGP_UNCPRIORITY = 2 + } + + [Flags] + private enum EShowWindowFlags : uint + { + SW_HIDE = 0, + SW_SHOWNORMAL = 1, + SW_NORMAL = 1, + SW_SHOWMINIMIZED = 2, + SW_SHOWMAXIMIZED = 3, + SW_MAXIMIZE = 3, + SW_SHOWNOACTIVATE = 4, + SW_SHOW = 5, + SW_MINIMIZE = 6, + SW_SHOWMINNOACTIVE = 7, + SW_SHOWNA = 8, + SW_RESTORE = 9, + SW_SHOWDEFAULT = 10, + SW_MAX = 10 + } + #endregion + + #region IShellLink Private structs + + [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0, CharSet=CharSet.Unicode)] + private struct _WIN32_FIND_DATAW + { + public uint dwFileAttributes; + public _FILETIME ftCreationTime; + public _FILETIME ftLastAccessTime; + public _FILETIME ftLastWriteTime; + public uint nFileSizeHigh; + public uint nFileSizeLow; + public uint dwReserved0; + public uint dwReserved1; + [MarshalAs(UnmanagedType.ByValTStr , SizeConst = 260)] // MAX_PATH + public string cFileName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] + public string cAlternateFileName; + } + + [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0, CharSet=CharSet.Ansi)] + private struct _WIN32_FIND_DATAA + { + public uint dwFileAttributes; + public _FILETIME ftCreationTime; + public _FILETIME ftLastAccessTime; + public _FILETIME ftLastWriteTime; + public uint nFileSizeHigh; + public uint nFileSizeLow; + public uint dwReserved0; + public uint dwReserved1; + [MarshalAs(UnmanagedType.ByValTStr , SizeConst = 260)] // MAX_PATH + public string cFileName; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)] + public string cAlternateFileName; + } + + [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0)] + private struct _FILETIME + { + public uint dwLowDateTime; + public uint dwHighDateTime; + } + #endregion + + #region UnManaged Methods + private class UnManagedMethods + { + [DllImport("Shell32", CharSet=CharSet.Auto)] + internal extern static int ExtractIconEx ( + [MarshalAs(UnmanagedType.LPTStr)] + string lpszFile, + int nIconIndex, + IntPtr[] phIconLarge, + IntPtr[] phIconSmall, + int nIcons); + + [DllImport("user32")] + internal static extern int DestroyIcon(IntPtr hIcon); + } + #endregion + + #endregion + + #region Enumerations + /// + /// Flags determining how the links with missing + /// targets are resolved. + /// + [Flags] + public enum EShellLinkResolveFlags : uint + { + /// + /// Allow any match during resolution. Has no effect + /// on ME/2000 or above, use the other flags instead. + /// + SLR_ANY_MATCH = 0x2, + /// + /// Call the Microsoft Windows Installer. + /// + SLR_INVOKE_MSI = 0x80, + /// + /// Disable distributed link tracking. By default, + /// distributed link tracking tracks removable media + /// across multiple devices based on the volume name. + /// It also uses the UNC path to track remote file + /// systems whose drive letter has changed. Setting + /// SLR_NOLINKINFO disables both types of tracking. + /// + SLR_NOLINKINFO = 0x40, + /// + /// Do not display a dialog box if the link cannot be resolved. + /// When SLR_NO_UI is set, a time-out value that specifies the + /// maximum amount of time to be spent resolving the link can + /// be specified in milliseconds. The function returns if the + /// link cannot be resolved within the time-out duration. + /// If the timeout is not set, the time-out duration will be + /// set to the default value of 3,000 milliseconds (3 seconds). + /// + SLR_NO_UI = 0x1, + /// + /// Not documented in SDK. Assume same as SLR_NO_UI but + /// intended for applications without a hWnd. + /// + SLR_NO_UI_WITH_MSG_PUMP = 0x101, + /// + /// Do not update the link information. + /// + SLR_NOUPDATE = 0x8, + /// + /// Do not execute the search heuristics. + /// + SLR_NOSEARCH = 0x10, + /// + /// Do not use distributed link tracking. + /// + SLR_NOTRACK = 0x20, + /// + /// If the link object has changed, update its path and list + /// of identifiers. If SLR_UPDATE is set, you do not need to + /// call IPersistFile::IsDirty to determine whether or not + /// the link object has changed. + /// + SLR_UPDATE = 0x4 + } + + public enum LinkDisplayMode : uint + { + edmNormal = EShowWindowFlags.SW_NORMAL, + edmMinimized = EShowWindowFlags.SW_SHOWMINNOACTIVE, + edmMaximized = EShowWindowFlags.SW_MAXIMIZE + } + #endregion + + #region Member Variables + // Use Unicode (W) under NT, otherwise use ANSI + private IShellLinkW linkW; + private IShellLinkA linkA; + private string shortcutFile = ""; + #endregion + + #region Constructor + /// + /// Creates an instance of the Shell Link object. + /// + public ShellLink() + { + if (System.Environment.OSVersion.Platform == PlatformID.Win32NT) + { + linkW = (IShellLinkW)new CShellLink(); + } + else + { + linkA = (IShellLinkA)new CShellLink(); + } + } + + /// + /// Creates an instance of a Shell Link object + /// from the specified link file + /// + /// The Shortcut file to open + public ShellLink(string linkFile) : this() + { + Open(linkFile); + } + #endregion + + #region Destructor and Dispose + /// + /// Call dispose just in case it hasn't happened yet + /// + ~ShellLink() + { + Dispose(); + } + + /// + /// Dispose the object, releasing the COM ShellLink object + /// + public void Dispose() + { + if (linkW != null ) + { + Marshal.ReleaseComObject(linkW); + linkW = null; + } + if (linkA != null) + { + Marshal.ReleaseComObject(linkA); + linkA = null; + } + } + #endregion + + #region Implementation + public string ShortCutFile + { + get + { + return this.shortcutFile; + } + set + { + this.shortcutFile = value; + } + } + + /// + /// Gets a System.Drawing.Icon containing the icon for this + /// ShellLink object. + /// + public Icon LargeIcon + { + get + { + return getIcon(true); + } + } + + public Icon SmallIcon + { + get + { + return getIcon(false); + } + } + + private Icon getIcon(bool large) + { + // Get icon index and path: + int iconIndex = 0; + StringBuilder iconPath = new StringBuilder(260, 260); + if (linkA == null) + { + linkW.GetIconLocation(iconPath, iconPath.Capacity, out iconIndex); + } + else + { + linkA.GetIconLocation(iconPath, iconPath.Capacity, out iconIndex); + } + string iconFile = iconPath.ToString(); + + // If there are no details set for the icon, then we must use + // the shell to get the icon for the target: + if (iconFile.Length == 0) + { + // Use the FileIcon object to get the icon: + FileIcon.SHGetFileInfoConstants flags = FileIcon.SHGetFileInfoConstants.SHGFI_ICON | + FileIcon.SHGetFileInfoConstants.SHGFI_ATTRIBUTES; + if (large) + { + flags = flags | FileIcon.SHGetFileInfoConstants.SHGFI_LARGEICON; + } + else + { + flags = flags | FileIcon.SHGetFileInfoConstants.SHGFI_SMALLICON; + } + FileIcon fileIcon = new FileIcon(Target, flags); + return fileIcon.ShellIcon; + } + else + { + // Use ExtractIconEx to get the icon: + IntPtr[] hIconEx = new IntPtr[1] {IntPtr.Zero}; + int iconCount = 0; + if (large) + { + iconCount = UnManagedMethods.ExtractIconEx( + iconFile, + iconIndex, + hIconEx, + null, + 1); + } + else + { + iconCount = UnManagedMethods.ExtractIconEx( + iconFile, + iconIndex, + null, + hIconEx, + 1); + } + // If success then return as a GDI+ object + Icon icon = null; + if (hIconEx[0] != IntPtr.Zero) + { + icon = Icon.FromHandle(hIconEx[0]); + //UnManagedMethods.DestroyIcon(hIconEx[0]); + } + return icon; + } + } + + /// + /// Gets the path to the file containing the icon for this shortcut. + /// + public string IconPath + { + get + { + StringBuilder iconPath = new StringBuilder(260, 260); + int iconIndex = 0; + if (linkA == null) + { + linkW.GetIconLocation(iconPath, iconPath.Capacity, out iconIndex); + } + else + { + linkA.GetIconLocation(iconPath, iconPath.Capacity, out iconIndex); + } + return iconPath.ToString(); + } + set + { + StringBuilder iconPath = new StringBuilder(260, 260); + int iconIndex = 0; + if (linkA == null) + { + linkW.GetIconLocation(iconPath, iconPath.Capacity, out iconIndex); + } + else + { + linkA.GetIconLocation(iconPath, iconPath.Capacity, out iconIndex); + } + if (linkA == null) + { + linkW.SetIconLocation(value, iconIndex); + } + else + { + linkA.SetIconLocation(value, iconIndex); + } + } + } + + /// + /// Gets the index of this icon within the icon path's resources + /// + public int IconIndex + { + get + { + StringBuilder iconPath = new StringBuilder(260, 260); + int iconIndex = 0; + if (linkA == null) + { + linkW.GetIconLocation(iconPath, iconPath.Capacity, out iconIndex); + } + else + { + linkA.GetIconLocation(iconPath, iconPath.Capacity, out iconIndex); + } + return iconIndex; + } + set + { + StringBuilder iconPath = new StringBuilder(260, 260); + int iconIndex = 0; + if (linkA == null) + { + linkW.GetIconLocation(iconPath, iconPath.Capacity, out iconIndex); + } + else + { + linkA.GetIconLocation(iconPath, iconPath.Capacity, out iconIndex); + } + if (linkA == null) + { + linkW.SetIconLocation(iconPath.ToString(), value); + } + else + { + linkA.SetIconLocation(iconPath.ToString(), value); + } + } + } + + /// + /// Gets/sets the fully qualified path to the link's target + /// + public string Target + { + get + { + StringBuilder target = new StringBuilder(260, 260); + if (linkA == null) + { + _WIN32_FIND_DATAW fd = new _WIN32_FIND_DATAW(); + linkW.GetPath(target, target.Capacity, ref fd, (uint)EShellLinkGP.SLGP_UNCPRIORITY); + } + else + { + _WIN32_FIND_DATAA fd = new _WIN32_FIND_DATAA(); + linkA.GetPath(target, target.Capacity, ref fd, (uint)EShellLinkGP.SLGP_UNCPRIORITY); + } + return target.ToString(); + } + set + { + if (linkA == null) + { + linkW.SetPath(value); + } + else + { + linkA.SetPath(value); + } + } + } + + /// + /// Gets/sets the Working Directory for the Link + /// + public string WorkingDirectory + { + get + { + StringBuilder path = new StringBuilder(260, 260); + if (linkA == null) + { + linkW.GetWorkingDirectory(path, path.Capacity); + } + else + { + linkA.GetWorkingDirectory(path, path.Capacity); + } + return path.ToString(); + } + set + { + if (linkA == null) + { + linkW.SetWorkingDirectory(value); + } + else + { + linkA.SetWorkingDirectory(value); + } + } + } + + /// + /// Gets/sets the description of the link + /// + public string Description + { + get + { + StringBuilder description = new StringBuilder(1024, 1024); + if (linkA == null) + { + linkW.GetDescription(description, description.Capacity); + } + else + { + linkA.GetDescription(description, description.Capacity); + } + return description.ToString(); + } + set + { + if (linkA == null) + { + linkW.SetDescription(value); + } + else + { + linkA.SetDescription(value); + } + } + } + + /// + /// Gets/sets any command line arguments associated with the link + /// + public string Arguments + { + get + { + StringBuilder arguments = new StringBuilder(260, 260); + if (linkA == null) + { + linkW.GetArguments(arguments, arguments.Capacity); + } + else + { + linkA.GetArguments(arguments, arguments.Capacity); + } + return arguments.ToString(); + } + set + { + if (linkA == null) + { + linkW.SetArguments(value); + } + else + { + linkA.SetArguments(value); + } + } + } + + /// + /// Gets/sets the initial display mode when the shortcut is + /// run + /// + public LinkDisplayMode DisplayMode + { + get + { + uint cmd = 0; + if (linkA == null) + { + linkW.GetShowCmd(out cmd); + } + else + { + linkA.GetShowCmd(out cmd); + } + return (LinkDisplayMode)cmd; + } + set + { + if (linkA == null) + { + linkW.SetShowCmd((uint)value); + } + else + { + linkA.SetShowCmd((uint)value); + } + } + } + + /// + /// Gets/sets the HotKey to start the shortcut (if any) + /// + public Keys HotKey + { + get + { + short key = 0; + if (linkA == null) + { + linkW.GetHotkey(out key); + } + else + { + linkA.GetHotkey(out key); + } + return (Keys)key; + } + set + { + if (linkA == null) + { + linkW.SetHotkey((short)value); + } + else + { + linkA.SetHotkey((short)value); + } + } + } + + /// + /// Saves the shortcut to ShortCutFile. + /// + public void Save() + { + Save(shortcutFile); + } + + /// + /// Saves the shortcut to the specified file + /// + /// The shortcut file (.lnk) + public void Save( + string linkFile + ) + { + // Save the object to disk + if (linkA == null) + { + ((IPersistFile)linkW).Save(linkFile, true); + shortcutFile = linkFile; + } + else + { + ((IPersistFile)linkA).Save(linkFile, true); + shortcutFile = linkFile; + } + } + + /// + /// Loads a shortcut from the specified file + /// + /// The shortcut file (.lnk) to load + public void Open( + string linkFile + ) + { + Open(linkFile, + IntPtr.Zero, + (EShellLinkResolveFlags.SLR_ANY_MATCH | EShellLinkResolveFlags.SLR_NO_UI), + 1); + } + + /// + /// Loads a shortcut from the specified file, and allows flags controlling + /// the UI behaviour if the shortcut's target isn't found to be set. + /// + /// The shortcut file (.lnk) to load + /// The window handle of the application's UI, if any + /// Flags controlling resolution behaviour + public void Open( + string linkFile, + IntPtr hWnd, + EShellLinkResolveFlags resolveFlags + ) + { + Open(linkFile, + hWnd, + resolveFlags, + 1); + } + + /// + /// Loads a shortcut from the specified file, and allows flags controlling + /// the UI behaviour if the shortcut's target isn't found to be set. If + /// no SLR_NO_UI is specified, you can also specify a timeout. + /// + /// The shortcut file (.lnk) to load + /// The window handle of the application's UI, if any + /// Flags controlling resolution behaviour + /// Timeout if SLR_NO_UI is specified, in ms. + public void Open( + string linkFile, + IntPtr hWnd, + EShellLinkResolveFlags resolveFlags, + ushort timeOut + ) + { + uint flags; + + if ((resolveFlags & EShellLinkResolveFlags.SLR_NO_UI) + == EShellLinkResolveFlags.SLR_NO_UI) + { + flags = (uint)((int)resolveFlags | (timeOut << 16)); + } + else + { + flags = (uint)resolveFlags; + } + + if (linkA == null) + { + ((IPersistFile)linkW).Load(linkFile, 0); //STGM_DIRECT) + linkW.Resolve(hWnd, flags); + this.shortcutFile = linkFile; + } + else + { + ((IPersistFile)linkA).Load(linkFile, 0); //STGM_DIRECT) + linkA.Resolve(hWnd, flags); + this.shortcutFile = linkFile; + } + } + #endregion + } + #endregion + +} diff --git a/Libraries/ShellLink/ShellLinkTester.csproj b/Libraries/ShellLink/ShellLinkTester.csproj new file mode 100644 index 0000000..5f36951 --- /dev/null +++ b/Libraries/ShellLink/ShellLinkTester.csproj @@ -0,0 +1,131 @@ + + + + Local + 7.0.9466 + 1.0 + {1202BE1B-9D2F-4B75-B02C-1790FECC2839} + Debug + AnyCPU + App.ico + + ShellLink + + JScript + Grid + IE50 + false + WinExe + ShellLink + + + + v2.0 + + + 0.0 + + + bin\Debug\ + false + 285212672 + false + + DEBUG;TRACE + + true + 4096 + false + false + false + false + 4 + full + prompt + + + bin\Release\ + false + 285212672 + false + + TRACE + + false + 4096 + true + false + false + false + 4 + none + prompt + + + + System + + + System.Data + + + System.Drawing + + + System.Windows.Forms + + + System.XML + + + + + Code + + + Component + + + Code + + + Form + + + Form + + + Form + + + Component + + + Component + + + Code + + + + AutoCompleteTextBox.cs + + + frmAbout.cs + + + frmIconPicker.cs + + + frmShellLinkTester.cs + + + IconPickerListBox.cs + + + + + + + + \ No newline at end of file diff --git a/Libraries/ShellLink/frmAbout.cs b/Libraries/ShellLink/frmAbout.cs new file mode 100644 index 0000000..b3a3218 --- /dev/null +++ b/Libraries/ShellLink/frmAbout.cs @@ -0,0 +1,212 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; + +namespace ShellLinkTester +{ + /// + /// Summary description for frmAbout. + /// + public class frmAbout : System.Windows.Forms.Form + { + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.TextBox txtInfo; + private System.Windows.Forms.LinkLabel lnkVbaccelerator; + private System.Windows.Forms.LinkLabel lnkNetProjectZip; + private System.Windows.Forms.Label lblName; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label lblInfo; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public frmAbout() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // + // TODO: Add any constructor code after InitializeComponent call + // + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(frmAbout)); + this.btnOK = new System.Windows.Forms.Button(); + this.txtInfo = new System.Windows.Forms.TextBox(); + this.lnkVbaccelerator = new System.Windows.Forms.LinkLabel(); + this.lnkNetProjectZip = new System.Windows.Forms.LinkLabel(); + this.lblName = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.label2 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.lblInfo = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // btnOK + // + this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.btnOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.btnOK.Location = new System.Drawing.Point(276, 324); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(92, 28); + this.btnOK.TabIndex = 0; + this.btnOK.Text = "OK"; + // + // txtInfo + // + this.txtInfo.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); + this.txtInfo.Location = new System.Drawing.Point(84, 148); + this.txtInfo.Multiline = true; + this.txtInfo.Name = "txtInfo"; + this.txtInfo.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtInfo.Size = new System.Drawing.Size(284, 112); + this.txtInfo.TabIndex = 1; + this.txtInfo.Text = ""; + // + // lnkVbaccelerator + // + this.lnkVbaccelerator.Location = new System.Drawing.Point(84, 284); + this.lnkVbaccelerator.Name = "lnkVbaccelerator"; + this.lnkVbaccelerator.Size = new System.Drawing.Size(284, 16); + this.lnkVbaccelerator.TabIndex = 2; + this.lnkVbaccelerator.TabStop = true; + this.lnkVbaccelerator.Text = "vbAccelerator.com Home Page"; + // + // lnkNetProjectZip + // + this.lnkNetProjectZip.Location = new System.Drawing.Point(84, 268); + this.lnkNetProjectZip.Name = "lnkNetProjectZip"; + this.lnkNetProjectZip.Size = new System.Drawing.Size(284, 16); + this.lnkNetProjectZip.TabIndex = 3; + this.lnkNetProjectZip.TabStop = true; + this.lnkNetProjectZip.Text = "ShellLink Home Page"; + this.lnkNetProjectZip.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkNetProjectZip_LinkClicked); + // + // lblName + // + this.lblName.Font = new System.Drawing.Font("Trebuchet MS", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); + this.lblName.Location = new System.Drawing.Point(92, 32); + this.lblName.Name = "lblName"; + this.lblName.Size = new System.Drawing.Size(276, 56); + this.lblName.TabIndex = 4; + this.lblName.Text = "Shell Link Tester"; + // + // label1 + // + this.label1.BackColor = System.Drawing.Color.RosyBrown; + this.label1.Font = new System.Drawing.Font("Trebuchet MS", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); + this.label1.Location = new System.Drawing.Point(92, 8); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(276, 20); + this.label1.TabIndex = 5; + this.label1.Text = "vbAccelerator.com"; + // + // pictureBox1 + // + this.pictureBox1.Image = ((System.Drawing.Bitmap)(resources.GetObject("pictureBox1.Image"))); + this.pictureBox1.Location = new System.Drawing.Point(8, 8); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(80, 80); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.pictureBox1.TabIndex = 6; + this.pictureBox1.TabStop = false; + // + // label2 + // + this.label2.BackColor = System.Drawing.Color.DarkGray; + this.label2.Location = new System.Drawing.Point(8, 92); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(360, 1); + this.label2.TabIndex = 7; + this.label2.Text = "label2"; + // + // label3 + // + this.label3.BackColor = System.Drawing.Color.DarkGray; + this.label3.Location = new System.Drawing.Point(4, 316); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(360, 1); + this.label3.TabIndex = 8; + this.label3.Text = "label3"; + // + // lblInfo + // + this.lblInfo.Location = new System.Drawing.Point(88, 96); + this.lblInfo.Name = "lblInfo"; + this.lblInfo.Size = new System.Drawing.Size(280, 48); + this.lblInfo.TabIndex = 9; + this.lblInfo.Text = "Demonstrates reading and writing Shortcuts through the ShellLink object."; + // + // frmAbout + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.BackColor = System.Drawing.SystemColors.Window; + this.ClientSize = new System.Drawing.Size(378, 360); + this.Controls.AddRange(new System.Windows.Forms.Control[] { + this.lblInfo, + this.label3, + this.label2, + this.pictureBox1, + this.label1, + this.lblName, + this.lnkNetProjectZip, + this.lnkVbaccelerator, + this.txtInfo, + this.btnOK}); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "frmAbout"; + this.ShowInTaskbar = false; + this.SizeGripStyle = System.Windows.Forms.SizeGripStyle.Hide; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "About ShellLink Tester"; + this.Load += new System.EventHandler(this.frmAbout_Load); + this.ResumeLayout(false); + + } + #endregion + + private void frmAbout_Load(object sender, System.EventArgs e) + { + + } + + private void lnkNetProjectZip_LinkClicked(object sender, System.Windows.Forms.LinkLabelLinkClickedEventArgs e) + { + + } + } +} diff --git a/Libraries/ShellLink/frmAbout.resx b/Libraries/ShellLink/frmAbout.resx new file mode 100644 index 0000000..7c07384 --- /dev/null +++ b/Libraries/ShellLink/frmAbout.resx @@ -0,0 +1,167 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + R0lGODlhUABQAPcAAAAAAIAAAACAAICAAAAAgIAAgACAgMDAwMDcwKbK8AQEBAgICAwMDBERERYWFhwc + HCIiIikpKVVVVU1NTUJCQjk5Of98gP9QUNYAk8zs/+/Wxufn1q2pkDMAAGYAAJkAAMwAAAAzADMzAGYz + AJkzAMwzAP8zAABmADNmAGZmAJlmAMxmAP9mAACZADOZAGaZAJmZAMyZAP+ZAADMADPMAGbMAJnMAMzM + AP/MAGb/AJn/AMz/AAAAMzMAM2YAM5kAM8wAM/8AMwAzMzMzM2YzM5kzM8wzM/8zMwBmMzNmM2ZmM5lm + M8xmM/9mMwCZMzOZM2aZM5mZM8yZM/+ZMwDMMzPMM2bMM5nMM8zMM//MMzP/M2b/M5n/M8z/M///MwAA + ZjMAZmYAZpkAZswAZv8AZgAzZjMzZmYzZpkzZswzZv8zZgBmZjNmZmZmZplmZsxmZgCZZjOZZmaZZpmZ + ZsyZZv+ZZgDMZjPMZpnMZszMZv/MZgD/ZjP/Zpn/Zsz/Zv8AzMwA/wCZmZkzmZkAmcwAmQAAmTMzmWYA + mcwzmf8AmQBmmTNmmWYzmZlmmcxmmf8zmTOZmWaZmZmZmcyZmf+ZmQDMmTPMmWbMZpnMmczMmf/MmQD/ + mTP/mWbMmZn/mcz/mf//mQAAzDMAmWYAzJkAzMwAzAAzmTMzzGYzzJkzzMwzzP8zzABmzDNmzGZmmZlm + zMxmzP9mmQCZzDOZzGaZzJmZzMyZzP+ZzADMzDPMzGbMzJnMzMzMzP/MzAD/zDP/zGb/mZn/zMz/zP// + zDMAzGYA/5kA/wAzzDMz/2Yz/5kz/8wz//8z/wBm/zNm/2ZmzJlm/8xm//9mzACZ/zOZ/2aZ/5mZ/8yZ + //+Z/wDM/zPM/2bM/5nM/8zM///M/zP//2b/zJn//8z///9mZmb/Zv//ZmZm//9m/2b//6UAIV9fX3d3 + d4aGhpaWlsvLy7KystfX193d3ePj4+rq6vHx8fj4+P/78KCgpICAgP8AAAD/AP//AAAA//8A/wD///// + /ywAAAAAUABQAAAI/wA9CBzooUOmOQU7CAwwkKEHhhAjMhwRIABFixUvUiSRMQDHjRbTgRwh0qNJkiA5 + DlQo0CCHDjADKMRIsSZGIhZr/riIM0ARiztF+iAxYqfRoihF/iyC8icREjtJOPWpxI3CDkvaeDjYwY0S + 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 + iQEBADs= + + + + frmAbout + + \ No newline at end of file diff --git a/Libraries/ShellLink/frmIconPicker.cs b/Libraries/ShellLink/frmIconPicker.cs new file mode 100644 index 0000000..dab56e9 --- /dev/null +++ b/Libraries/ShellLink/frmIconPicker.cs @@ -0,0 +1,322 @@ +using System; +using System.Collections; +using System.ComponentModel; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +using vbAccelerator.Controls.ListBox; +using vbAccelerator.Controls.TextBox; + +namespace vbAccelerator.Forms.IconPicker +{ + + internal class UnManagedMethods + { + [DllImport("Shell32", CharSet=CharSet.Auto)] + internal extern static int ExtractIconEx ( + [MarshalAs(UnmanagedType.LPTStr)] + string lpszFile, + int nIconIndex, + IntPtr[] phIconLarge, + IntPtr[] phIconSmall, + int nIcons); + } + + /// + /// Summary description for frmIconPicker. + /// + public class frmIconPicker : System.Windows.Forms.Form + { + private string iconFile = ""; + private int iconIndex = -1; + private bool loaded = false; + + private vbAccelerator.Controls.TextBox.AutoCompleteTextBox txtTarget; + private System.Windows.Forms.Label lblTarget; + private System.Windows.Forms.Button btnPick; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Button btnCancel; + private vbAccelerator.Controls.ListBox.IconPickerListBox lstIcons; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public Icon LargeIcon + { + get + { + IntPtr[] hIconEx = new IntPtr[1] {IntPtr.Zero}; + int iconCount = UnManagedMethods.ExtractIconEx( + iconFile, + iconIndex, + hIconEx, + null, + 1); + // If success then return as a GDI+ object + Icon icon = null; + if (hIconEx[0] != IntPtr.Zero) + { + icon = Icon.FromHandle(hIconEx[0]); + //UnManagedMethods.DestroyIcon(hIconEx[0]); + } + return icon; + } + } + + public Icon SmallIcon + { + get + { + IntPtr[] hIconEx = new IntPtr[1] {IntPtr.Zero}; + int iconCount = UnManagedMethods.ExtractIconEx( + iconFile, + iconIndex, + null, + hIconEx, + 1); + // If success then return as a GDI+ object + Icon icon = null; + if (hIconEx[0] != IntPtr.Zero) + { + icon = Icon.FromHandle(hIconEx[0]); + //UnManagedMethods.DestroyIcon(hIconEx[0]); + } + return icon; + } + } + + public string IconFile + { + get + { + return iconFile; + } + set + { + iconFile = value; + if (loaded) + { + loadIcons(); + selectIconIndex(); + } + } + } + public int IconIndex + { + get + { + return iconIndex; + } + set + { + iconIndex = value; + if (loaded) + { + selectIconIndex(); + } + } + } + + public frmIconPicker() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // Set up target: + txtTarget.AutoCompleteFlags = AutoCompleteTextBox.SHAutoCompleteFlags.SHACF_FILESYS_ONLY; + + } + public frmIconPicker(string iconFile) : this() + { + this.iconFile = iconFile; + } + public frmIconPicker(string iconFile, int iconIndex) : this() + { + this.iconFile = iconFile; + this.iconIndex = iconIndex; + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if(components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.lstIcons = new vbAccelerator.Controls.ListBox.IconPickerListBox(); + this.txtTarget = new vbAccelerator.Controls.TextBox.AutoCompleteTextBox(); + this.lblTarget = new System.Windows.Forms.Label(); + this.btnPick = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.btnOK = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lstIcons + // + this.lstIcons.ColumnWidth = 36; + this.lstIcons.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; + this.lstIcons.HorizontalScrollbar = true; + this.lstIcons.IconSize = vbAccelerator.Controls.ListBox.IconPickerListBox.IconPickerIconSize.large; + this.lstIcons.ItemHeight = 36; + this.lstIcons.Location = new System.Drawing.Point(8, 80); + this.lstIcons.MultiColumn = true; + this.lstIcons.Name = "lstIcons"; + this.lstIcons.Size = new System.Drawing.Size(304, 148); + this.lstIcons.TabIndex = 0; + this.lstIcons.SelectedIndexChanged += new System.EventHandler(this.lstIcons_SelectedIndexChanged); + // + // txtTarget + // + this.txtTarget.AutoCompleteFlags = vbAccelerator.Controls.TextBox.AutoCompleteTextBox.SHAutoCompleteFlags.SHACF_FILESYS_ONLY; + this.txtTarget.Location = new System.Drawing.Point(8, 24); + this.txtTarget.Name = "txtTarget"; + this.txtTarget.Size = new System.Drawing.Size(228, 21); + this.txtTarget.TabIndex = 4; + this.txtTarget.Text = ""; + // + // lblTarget + // + this.lblTarget.Location = new System.Drawing.Point(8, 4); + this.lblTarget.Name = "lblTarget"; + this.lblTarget.Size = new System.Drawing.Size(228, 20); + this.lblTarget.TabIndex = 3; + this.lblTarget.Text = "&Look for icons in this file:"; + // + // btnPick + // + this.btnPick.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.btnPick.Location = new System.Drawing.Point(240, 24); + this.btnPick.Name = "btnPick"; + this.btnPick.Size = new System.Drawing.Size(75, 24); + this.btnPick.TabIndex = 5; + this.btnPick.Text = "&Browse..."; + this.btnPick.Click += new System.EventHandler(this.btnPick_Click); + // + // label1 + // + this.label1.Location = new System.Drawing.Point(12, 60); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(300, 16); + this.label1.TabIndex = 6; + this.label1.Text = "Select an icon from the list below:"; + // + // btnOK + // + this.btnOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.btnOK.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.btnOK.Location = new System.Drawing.Point(152, 248); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(80, 28); + this.btnOK.TabIndex = 7; + this.btnOK.Text = "OK"; + // + // btnCancel + // + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.btnCancel.Location = new System.Drawing.Point(232, 248); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(80, 28); + this.btnCancel.TabIndex = 8; + this.btnCancel.Text = "Cancel"; + // + // frmIconPicker + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(322, 284); + this.Controls.AddRange(new System.Windows.Forms.Control[] { + this.btnCancel, + this.btnOK, + this.label1, + this.btnPick, + this.txtTarget, + this.lblTarget, + this.lstIcons}); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "frmIconPicker"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Choose Icon"; + this.Load += new System.EventHandler(this.frmIconPicker_Load); + this.ResumeLayout(false); + + } + #endregion + + private void frmIconPicker_Load(object sender, System.EventArgs e) + { + loadIcons(); + selectIconIndex(); + } + + private void loadIcons() + { + lstIcons.Items.Clear(); + if (iconFile.Length > 0) + { + lstIcons.LoadIcons(iconFile); + } + txtTarget.Text = iconFile; + } + + private void selectIconIndex() + { + if ((iconIndex > -1) && (iconIndex < lstIcons.Items.Count)) + { + lstIcons.SelectedIndex = iconIndex; + } + else + { + if (lstIcons.Items.Count > 0) + { + lstIcons.SelectedIndex = 0; + } + } + } + + private void lstIcons_SelectedIndexChanged(object sender, System.EventArgs e) + { + iconIndex = lstIcons.SelectedIndex; + } + + private void btnPick_Click(object sender, System.EventArgs e) + { + OpenFileDialog o = new OpenFileDialog(); + o.Filter = "Icon Files|*.EXE;*.DLL;*.ICO|Programs|*.EXE|Libraries|*.DLL|Icon Files|*.ICO|All Files (*.*)|*.*"; + o.FilterIndex = 1; + o.CheckFileExists = true; + o.CheckPathExists = true; + if (o.ShowDialog(this) == DialogResult.OK) + { + iconFile = o.FileName; + iconIndex = 0; + loadIcons(); + selectIconIndex(); + } + } + + } +} diff --git a/Libraries/ShellLink/frmIconPicker.resx b/Libraries/ShellLink/frmIconPicker.resx new file mode 100644 index 0000000..e6571d0 --- /dev/null +++ b/Libraries/ShellLink/frmIconPicker.resx @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + frmIconPicker + + \ No newline at end of file diff --git a/Libraries/ShellLink/frmShellLinkTester.cs b/Libraries/ShellLink/frmShellLinkTester.cs new file mode 100644 index 0000000..e866d1c --- /dev/null +++ b/Libraries/ShellLink/frmShellLinkTester.cs @@ -0,0 +1,543 @@ +using System; +using System.Drawing; +using System.Collections; +using System.ComponentModel; +using System.Windows.Forms; +using System.Data; +using System.Text; + +using vbAccelerator.Components.Shell; +using vbAccelerator.Controls.TextBox; +using vbAccelerator.Components.Menu; +using vbAccelerator.Forms.IconPicker; + +namespace ShellLinkTester +{ + /// + /// Summary description for Form1. + /// + public class frmShellLinkTester : System.Windows.Forms.Form + { + private ShellLink link = new ShellLink(); + private IconMainMenu mnuMain; + private IconMenuItem mnuFileTop; + private IconMenuItem mnuNew; + private IconMenuItem mnuOpen; + private IconMenuItem mnuClose; + private IconMenuItem mnuFileSep1; + private IconMenuItem mnuSave; + private IconMenuItem mnuSaveAs; + private IconMenuItem mnuFileSep2; + private IconMenuItem mnuExit; + private IconMenuItem mnuHelpTop; + private IconMenuItem mnuAbout; + private System.Windows.Forms.Label lblShortCut; + private System.Windows.Forms.Label lblTarget; + private AutoCompleteTextBox txtTarget; + private System.Windows.Forms.TextBox txtArguments; + private System.Windows.Forms.TextBox txtDescription; + private System.Windows.Forms.Label lblArguments; + private System.Windows.Forms.Label lblDescription; + private System.Windows.Forms.Button btnPick; + private System.Windows.Forms.GroupBox fraIcon; + private System.Windows.Forms.Label lblIconIndex; + private System.Windows.Forms.Label lblIconFile; + private System.Windows.Forms.TextBox txtIconFile; + private System.Windows.Forms.TextBox txtIconIndex; + private System.Windows.Forms.PictureBox picIcon; + private System.Windows.Forms.PictureBox picSmallIcon; + private System.Windows.Forms.Button btnChooseIcon; + /// + /// Required designer variable. + /// + private System.ComponentModel.Container components = null; + + public frmShellLinkTester() + { + // + // Required for Windows Form Designer support + // + InitializeComponent(); + + // Set up the form: + txtTarget.AutoCompleteFlags = AutoCompleteTextBox.SHAutoCompleteFlags.SHACF_FILESYS_ONLY; + mnuNew.Click += new System.EventHandler(this.mnu_Click); + mnuOpen.Click += new System.EventHandler(this.mnu_Click); + mnuClose.Click += new System.EventHandler(this.mnu_Click); + mnuSave.Click += new System.EventHandler(this.mnu_Click); + mnuSaveAs.Click += new System.EventHandler(this.mnu_Click); + mnuExit.Click += new System.EventHandler(this.mnu_Click); + mnuAbout.Click += new System.EventHandler(this.mnu_Click); + + } + + /// + /// Clean up any resources being used. + /// + protected override void Dispose( bool disposing ) + { + if( disposing ) + { + if (components != null) + { + components.Dispose(); + } + } + base.Dispose( disposing ); + } + + #region Windows Form Designer generated code + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(frmShellLinkTester)); + this.mnuMain = new IconMainMenu(); + this.mnuFileTop = new IconMenuItem(); + this.mnuNew = new IconMenuItem(); + this.mnuOpen = new IconMenuItem(); + this.mnuClose = new IconMenuItem(); + this.mnuFileSep1 = new IconMenuItem(); + this.mnuSave = new IconMenuItem(); + this.mnuSaveAs = new IconMenuItem(); + this.mnuFileSep2 = new IconMenuItem(); + this.mnuExit = new IconMenuItem(); + this.mnuHelpTop = new IconMenuItem(); + this.mnuAbout = new IconMenuItem(); + this.lblShortCut = new System.Windows.Forms.Label(); + this.lblTarget = new System.Windows.Forms.Label(); + this.txtTarget = new vbAccelerator.Controls.TextBox.AutoCompleteTextBox(); + this.txtArguments = new System.Windows.Forms.TextBox(); + this.txtDescription = new System.Windows.Forms.TextBox(); + this.lblArguments = new System.Windows.Forms.Label(); + this.lblDescription = new System.Windows.Forms.Label(); + this.btnPick = new System.Windows.Forms.Button(); + this.fraIcon = new System.Windows.Forms.GroupBox(); + this.btnChooseIcon = new System.Windows.Forms.Button(); + this.picIcon = new System.Windows.Forms.PictureBox(); + this.picSmallIcon = new System.Windows.Forms.PictureBox(); + this.txtIconIndex = new System.Windows.Forms.TextBox(); + this.txtIconFile = new System.Windows.Forms.TextBox(); + this.lblIconIndex = new System.Windows.Forms.Label(); + this.lblIconFile = new System.Windows.Forms.Label(); + this.fraIcon.SuspendLayout(); + this.SuspendLayout(); + // + // mnuMain + // + this.mnuMain.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { + this.mnuFileTop, + this.mnuHelpTop}); + // + // mnuFileTop + // + this.mnuFileTop.Index = 0; + this.mnuFileTop.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { + this.mnuNew, + this.mnuOpen, + this.mnuClose, + this.mnuFileSep1, + this.mnuSave, + this.mnuSaveAs, + this.mnuFileSep2, + this.mnuExit}); + this.mnuFileTop.Text = "&File"; + // + // mnuNew + // + this.mnuNew.Index = 0; + this.mnuNew.Shortcut = System.Windows.Forms.Shortcut.CtrlN; + this.mnuNew.Text = "&New"; + // + // mnuOpen + // + this.mnuOpen.Index = 1; + this.mnuOpen.Shortcut = System.Windows.Forms.Shortcut.CtrlO; + this.mnuOpen.Text = "&Open..."; + // + // mnuClose + // + this.mnuClose.Index = 2; + this.mnuClose.Text = "&Close"; + // + // mnuFileSep1 + // + this.mnuFileSep1.Index = 3; + this.mnuFileSep1.Text = "-"; + // + // mnuSave + // + this.mnuSave.Index = 4; + this.mnuSave.Shortcut = System.Windows.Forms.Shortcut.CtrlS; + this.mnuSave.Text = "&Save"; + // + // mnuSaveAs + // + this.mnuSaveAs.Index = 5; + this.mnuSaveAs.Text = "Save &As..."; + // + // mnuFileSep2 + // + this.mnuFileSep2.Index = 6; + this.mnuFileSep2.Text = "-"; + // + // mnuExit + // + this.mnuExit.Index = 7; + this.mnuExit.Text = "E&xit"; + // + // mnuHelpTop + // + this.mnuHelpTop.Index = 1; + this.mnuHelpTop.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { + this.mnuAbout}); + this.mnuHelpTop.Text = "&Help"; + // + // mnuAbout + // + this.mnuAbout.Index = 0; + this.mnuAbout.Text = "&About..."; + // + // lblShortCut + // + this.lblShortCut.BackColor = System.Drawing.SystemColors.ControlDark; + this.lblShortCut.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); + this.lblShortCut.ForeColor = System.Drawing.SystemColors.ControlLight; + this.lblShortCut.Location = new System.Drawing.Point(4, 4); + this.lblShortCut.Name = "lblShortCut"; + this.lblShortCut.Size = new System.Drawing.Size(372, 24); + this.lblShortCut.TabIndex = 0; + this.lblShortCut.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // lblTarget + // + this.lblTarget.Location = new System.Drawing.Point(4, 40); + this.lblTarget.Name = "lblTarget"; + this.lblTarget.Size = new System.Drawing.Size(68, 20); + this.lblTarget.TabIndex = 1; + this.lblTarget.Text = "&Target:"; + // + // txtTarget + // + this.txtTarget.AutoCompleteFlags = vbAccelerator.Controls.TextBox.AutoCompleteTextBox.SHAutoCompleteFlags.SHACF_FILESYS_ONLY; + this.txtTarget.Location = new System.Drawing.Point(72, 36); + this.txtTarget.Name = "txtTarget"; + this.txtTarget.Size = new System.Drawing.Size(280, 21); + this.txtTarget.TabIndex = 2; + this.txtTarget.Text = ""; + // + // txtArguments + // + this.txtArguments.Location = new System.Drawing.Point(72, 60); + this.txtArguments.Name = "txtArguments"; + this.txtArguments.Size = new System.Drawing.Size(280, 21); + this.txtArguments.TabIndex = 3; + this.txtArguments.Text = ""; + // + // txtDescription + // + this.txtDescription.Location = new System.Drawing.Point(72, 112); + this.txtDescription.MaxLength = 1024; + this.txtDescription.Multiline = true; + this.txtDescription.Name = "txtDescription"; + this.txtDescription.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtDescription.Size = new System.Drawing.Size(280, 80); + this.txtDescription.TabIndex = 4; + this.txtDescription.Text = ""; + // + // lblArguments + // + this.lblArguments.Location = new System.Drawing.Point(4, 64); + this.lblArguments.Name = "lblArguments"; + this.lblArguments.Size = new System.Drawing.Size(68, 23); + this.lblArguments.TabIndex = 9; + this.lblArguments.Text = "Arguments:"; + // + // lblDescription + // + this.lblDescription.Location = new System.Drawing.Point(4, 112); + this.lblDescription.Name = "lblDescription"; + this.lblDescription.Size = new System.Drawing.Size(68, 23); + this.lblDescription.TabIndex = 10; + this.lblDescription.Text = "Description:"; + // + // btnPick + // + this.btnPick.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.btnPick.Location = new System.Drawing.Point(356, 36); + this.btnPick.Name = "btnPick"; + this.btnPick.Size = new System.Drawing.Size(20, 20); + this.btnPick.TabIndex = 13; + this.btnPick.Text = "..."; + this.btnPick.Click += new System.EventHandler(this.btnPick_Click); + // + // fraIcon + // + this.fraIcon.Anchor = System.Windows.Forms.AnchorStyles.None; + this.fraIcon.Controls.AddRange(new System.Windows.Forms.Control[] { + this.btnChooseIcon, + this.picIcon, + this.picSmallIcon, + this.txtIconIndex, + this.txtIconFile, + this.lblIconIndex, + this.lblIconFile}); + this.fraIcon.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.fraIcon.Location = new System.Drawing.Point(8, 200); + this.fraIcon.Name = "fraIcon"; + this.fraIcon.Size = new System.Drawing.Size(344, 156); + this.fraIcon.TabIndex = 14; + this.fraIcon.TabStop = false; + this.fraIcon.Text = "Icon:"; + // + // btnChooseIcon + // + this.btnChooseIcon.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.btnChooseIcon.Location = new System.Drawing.Point(64, 116); + this.btnChooseIcon.Name = "btnChooseIcon"; + this.btnChooseIcon.Size = new System.Drawing.Size(76, 32); + this.btnChooseIcon.TabIndex = 19; + this.btnChooseIcon.Text = "Pick..."; + this.btnChooseIcon.Click += new System.EventHandler(this.btnChooseIcon_Click); + // + // picIcon + // + this.picIcon.Location = new System.Drawing.Point(68, 80); + this.picIcon.Name = "picIcon"; + this.picIcon.Size = new System.Drawing.Size(32, 32); + this.picIcon.TabIndex = 18; + this.picIcon.TabStop = false; + // + // picSmallIcon + // + this.picSmallIcon.Location = new System.Drawing.Point(104, 80); + this.picSmallIcon.Name = "picSmallIcon"; + this.picSmallIcon.Size = new System.Drawing.Size(32, 32); + this.picSmallIcon.TabIndex = 17; + this.picSmallIcon.TabStop = false; + // + // txtIconIndex + // + this.txtIconIndex.BackColor = System.Drawing.SystemColors.Control; + this.txtIconIndex.Location = new System.Drawing.Point(64, 52); + this.txtIconIndex.Name = "txtIconIndex"; + this.txtIconIndex.ReadOnly = true; + this.txtIconIndex.Size = new System.Drawing.Size(276, 21); + this.txtIconIndex.TabIndex = 16; + this.txtIconIndex.Text = ""; + // + // txtIconFile + // + this.txtIconFile.BackColor = System.Drawing.SystemColors.Control; + this.txtIconFile.Location = new System.Drawing.Point(64, 24); + this.txtIconFile.Name = "txtIconFile"; + this.txtIconFile.ReadOnly = true; + this.txtIconFile.Size = new System.Drawing.Size(276, 21); + this.txtIconFile.TabIndex = 15; + this.txtIconFile.Text = ""; + // + // lblIconIndex + // + this.lblIconIndex.Location = new System.Drawing.Point(4, 52); + this.lblIconIndex.Name = "lblIconIndex"; + this.lblIconIndex.TabIndex = 14; + this.lblIconIndex.Text = "Icon Index:"; + // + // lblIconFile + // + this.lblIconFile.Location = new System.Drawing.Point(4, 24); + this.lblIconFile.Name = "lblIconFile"; + this.lblIconFile.Size = new System.Drawing.Size(60, 23); + this.lblIconFile.TabIndex = 13; + this.lblIconFile.Text = "Icon File:"; + // + // frmShellLinkTester + // + this.AutoScaleBaseSize = new System.Drawing.Size(5, 14); + this.ClientSize = new System.Drawing.Size(380, 365); + this.Controls.AddRange(new System.Windows.Forms.Control[] { + this.fraIcon, + this.btnPick, + this.lblDescription, + this.lblArguments, + this.txtDescription, + this.txtArguments, + this.txtTarget, + this.lblTarget, + this.lblShortCut}); + this.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Menu = this.mnuMain; + this.Name = "frmShellLinkTester"; + this.Text = "Shell Link Tester"; + this.Load += new System.EventHandler(this.frmShellLinkTester_Load); + this.fraIcon.ResumeLayout(false); + this.ResumeLayout(false); + + } + #endregion + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.Run(new frmShellLinkTester()); + } + + private void openShortcut() + { + OpenFileDialog o = new OpenFileDialog(); + o.Filter = "Shortcuts (*.lnk)|*.LNK|All Files (*.*)|*.*"; + o.DefaultExt = "LNK"; + o.CheckFileExists = true; + o.CheckPathExists = true; + if (o.ShowDialog() == DialogResult.OK) + { + link.Open(o.FileName); + showDetails(); + } + } + + private void showDetails() + { + // show the link's details: + lblShortCut.Text = System.IO.Path.GetFileName(link.ShortCutFile); + + txtTarget.Text = link.Target; + txtArguments.Text = link.Arguments; + txtDescription.Text = link.Description; + txtIconFile.Text = link.IconPath; + txtIconIndex.Text = (link.IconPath.Length > 0 ? link.IconIndex.ToString() : ""); + System.Drawing.Icon linkIcon = link.LargeIcon; + if (linkIcon != null) + { + picIcon.Image = linkIcon.ToBitmap(); + linkIcon.Dispose(); + } + else + { + picIcon.Image = null; + } + linkIcon = link.SmallIcon; + if (linkIcon != null) + { + picSmallIcon.Image = linkIcon.ToBitmap(); + linkIcon.Dispose(); + } + else + { + picSmallIcon.Image = null; + } + + } + + private void saveShortcutAs() + { + SaveFileDialog s = new SaveFileDialog(); + s.Filter = "Shortcut Files (*.lnk)|*.lnk|All Files (*.*)|*.*"; + s.FilterIndex = 1; + s.DefaultExt = "LNK"; + s.CheckPathExists = true; + if (s.ShowDialog(this) == DialogResult.OK) + { + // set path to save to + link.ShortCutFile = s.FileName; + + // set the details of the link: + link.Target = txtTarget.Text; + link.Arguments = txtArguments.Text; + link.Description = txtDescription.Text; + link.IconPath = txtIconFile.Text; + link.IconIndex = (txtIconIndex.Text.Length > 0 ? + System.Int32.Parse(txtIconIndex.Text) : 0); + + // save the link: + link.Save(); + + // refresh details: + showDetails(); + } + } + + private void frmShellLinkTester_Load(object sender, System.EventArgs e) + { + + } + + private void mnu_Click(object sender, System.EventArgs e) + { + if ((sender == mnuNew) || (sender == mnuClose)) + { + link = new ShellLink(); + showDetails(); + } + else if (sender == mnuOpen) + { + openShortcut(); + } + else if (sender == mnuSave) + { + if (link.ShortCutFile.Length == 0) + { + saveShortcutAs(); + } + else + { + link.Save(); + } + } + else if (sender == mnuSaveAs) + { + saveShortcutAs(); + } + else if (sender == mnuExit) + { + this.Close(); + } + else if (sender == mnuAbout) + { + frmAbout a = new frmAbout(); + a.ShowDialog(this); + a.Dispose(); + } + } + + private void btnChooseIcon_Click(object sender, System.EventArgs e) + { + frmIconPicker fi = null; + if (link.IconPath.Length > 0) + { + fi = new frmIconPicker(link.IconPath, link.IconIndex); + } + else + { + fi = new frmIconPicker(link.Target, 0); + } + if (fi.ShowDialog(this) == DialogResult.OK) + { + txtIconFile.Text = fi.IconFile; + txtIconIndex.Text = fi.IconIndex.ToString(); + picIcon.Image = fi.LargeIcon.ToBitmap(); + picSmallIcon.Image = fi.SmallIcon.ToBitmap(); + } + fi.Dispose(); + } + + private void btnPick_Click(object sender, System.EventArgs e) + { + OpenFileDialog o = new OpenFileDialog(); + o.Filter = "All Files (*.*)|*.*"; + o.CheckFileExists = true; + o.CheckPathExists = true; + if (o.ShowDialog() == DialogResult.OK) + { + txtTarget.Text = o.FileName; + } + } + + } +} diff --git a/Libraries/ShellLink/frmShellLinkTester.resx b/Libraries/ShellLink/frmShellLinkTester.resx new file mode 100644 index 0000000..c976eaf --- /dev/null +++ b/Libraries/ShellLink/frmShellLinkTester.resx @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + frmShellLinkTester + + + + AAABAAQAEBAQAAAAAAAoAQAARgAAACAgEAAAAAAA6AIAAG4BAAAgIAAAAAAAAKgIAABWBAAAEBAAAAAA + AABoBQAA/gwAACgAAAAQAAAAIAAAAAEABAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAACA + AAAAgIAAgAAAAIAAgACAgAAAwMDAAICAgAAAAP8AAP8AAAD//wD/AAAA/wD/AP//AAD///8AAAAAAAAA + AAABEREREREREAERERu7uxEQAREROxE7ERABERE7M7sREAEREREzOxEQARj/GzG79xABF3+Du7GPEAEf + h3GPER8QAY8Y8Y8RHxABfxH4j3h/EAF4EXiPh3gQAREREY8RERABERERjxEREAEREREQEREQAAAAAAAA + AAD/////gAH//4AB//+AAf//gAH//4AB//+AAf//gAH//4AB//+AAf//gAH//4AB//+AAf//gAH//4BB + /////2YCKAAAACAAAABAAAAAAQAEAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIAAAACA + gACAAAAAgACAAICAAADAwMAAgICAAAAA/wAA/wAAAP//AP8AAAD/AP8A//8AAP///wARERERERERAQEB + AAAAAAAAEREREREREREBAAAAAAAAABEREREREREQEQEAAAAAAAARERERERGYgQGIEAAAAAAAERERERF/ + //93/4AAAAAAABEREREX/3eIf/+AAAAAAAARERERH/8REBf/gQAAAAAAERERER//EQEY/4AAAAAAABER + EREf/4EQF/+AAAAAAAARERERGP//d///gAAAAAAAERERERF///93/4AAAAAAABERERERERGBGP+AAAAA + AAAREREREXgREQj/gAAAAAAAERERERj/8RAf/xAAAAAAABERERER//////cAAAAAAAARERERERf///dx + EAAAAAAAERERG7sxEDs7u7sQAAAAABERETu7sRE7uzO7MAAAAAARERG7O7EQO7EAG7EAAAAAERERuxOz + ETsxAAuzAAAAABERE7MTsxE7MAALswAAAAARERuzEbsROzAQC7MAAAAAEREbsRG7ETuxABuzAAAAABER + O7EROzE7uxE7sAAAAAAREbsxETuxOzu7u5AAAAAAEREzERETMTsxMzEAAAAAABERERERERA7MBAAAAAA + AAAREREREREROzAAAAAAAAAAEREREREREDsxAAAAAAAAABEREREREQETMAAAAAAAAAARERERERERARAQ + AAAAAAAAEREREREREBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKAAAACAAAABAAAAAAQAIAAAAAAAABAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAIAAAIAAAACAgACAAAAAgACAAICAAADAwMAAwNzAAPDKpgAEBAQACAgIAAwM + DAAREREAFhYWABwcHAAiIiIAKSkpAFVVVQBNTU0AQkJCADk5OQCAfP8AUFD/AJMA1gD/7MwAxtbvANbn + 5wCQqa0AAAAzAAAAZgAAAJkAAADMAAAzAAAAMzMAADNmAAAzmQAAM8wAADP/AABmAAAAZjMAAGZmAABm + mQAAZswAAGb/AACZAAAAmTMAAJlmAACZmQAAmcwAAJn/AADMAAAAzDMAAMxmAADMmQAAzMwAAMz/AAD/ + ZgAA/5kAAP/MADMAAAAzADMAMwBmADMAmQAzAMwAMwD/ADMzAAAzMzMAMzNmADMzmQAzM8wAMzP/ADNm + AAAzZjMAM2ZmADNmmQAzZswAM2b/ADOZAAAzmTMAM5lmADOZmQAzmcwAM5n/ADPMAAAzzDMAM8xmADPM + mQAzzMwAM8z/ADP/MwAz/2YAM/+ZADP/zAAz//8AZgAAAGYAMwBmAGYAZgCZAGYAzABmAP8AZjMAAGYz + MwBmM2YAZjOZAGYzzABmM/8AZmYAAGZmMwBmZmYAZmaZAGZmzABmmQAAZpkzAGaZZgBmmZkAZpnMAGaZ + /wBmzAAAZswzAGbMmQBmzMwAZsz/AGb/AABm/zMAZv+ZAGb/zADMAP8A/wDMAJmZAACZM5kAmQCZAJkA + zACZAAAAmTMzAJkAZgCZM8wAmQD/AJlmAACZZjMAmTNmAJlmmQCZZswAmTP/AJmZMwCZmWYAmZmZAJmZ + zACZmf8AmcwAAJnMMwBmzGYAmcyZAJnMzACZzP8Amf8AAJn/MwCZzGYAmf+ZAJn/zACZ//8AzAAAAJkA + MwDMAGYAzACZAMwAzACZMwAAzDMzAMwzZgDMM5kAzDPMAMwz/wDMZgAAzGYzAJlmZgDMZpkAzGbMAJlm + /wDMmQAAzJkzAMyZZgDMmZkAzJnMAMyZ/wDMzAAAzMwzAMzMZgDMzJkAzMzMAMzM/wDM/wAAzP8zAJn/ + ZgDM/5kAzP/MAMz//wDMADMA/wBmAP8AmQDMMwAA/zMzAP8zZgD/M5kA/zPMAP8z/wD/ZgAA/2YzAMxm + ZgD/ZpkA/2bMAMxm/wD/mQAA/5kzAP+ZZgD/mZkA/5nMAP+Z/wD/zAAA/8wzAP/MZgD/zJkA/8zMAP/M + /wD//zMAzP9mAP//mQD//8wAZmb/AGb/ZgBm//8A/2ZmAP9m/wD//2YAIQClAF9fXwB3d3cAhoaGAJaW + lgDLy8sAsrKyANfX1wDd3d0A4+PjAOrq6gDx8fEA+Pj4APD7/wCkoKAAgICAAAAA/wAA/wAAAP//AP8A + AAD/AP8A//8AAP///wAfHx8BAQEBAR4BHh4eHh0eHR4dHh0dHR0dDB0MHQwMDB8fAR8BAQEBAR4BHh4e + Hh4dHh0dHR0dHR0dDB0MDAwMHx8fAQEBAQEeHh4eHh4eHR4eHR4dHR0dHR0MHQoMHQofHwEfAQEBAR4B + HkRv7W5FHUTtbkQdHR0dDB0MHQoMDB8fAR8BAQEeAQHw///////wk///7R0dHR0dDB0MDAwMHx8fAR8B + AQEek///GpNu7Rr0//9uHR0dDB0MHQwdDAwfHwEBAQEBAR70//9EHh4dHrz//+weHR0dHQwdCgwMDB8f + AR8BAQEeAf///x4eHR4e7P//7B0dHR0MHQwdDAwMHx8fAQEBAQEe9P//bh4eHUQa///sHR0dHR0MHQoM + DAwfHwEfAQEBHgFu////8gca/////24dHR0MHQwMHQwMDB8BHwEBAQEBHh6T8v////+8k///7R0dHR0d + DB0KDAwMHx8BHwEBAR4BHh4eREUSHh5z//9uHR0dHQwdDB0MDAwfHwEfAQEBAR5Fk25FHh4eHY32/+0d + HR0MHQwdDAwMDB8fAQEBAQEeAW7///JEHh1EG///RB0dHR0dDB0MDAwMHwEfAQEBAR4eRPb///////// + /xodHR0dHQwdDAwMDAofHwEfAQEfJCQkRQfy/////7wcRCMdHR0MHQwdDB0KCh8BHwEBASRZMlkxHh4d + KlMxK1k4MlgjHR0dDAwMDAwKHx8BAQEBMThTOFMeHh4qWThSKipTODIiHQwdDB0KCgofAR8BAQFTOCo4 + WSQeHStTOB4dHSMyWSMdDB0KDB0KCh8fAQEBJDhTAVI4Kx4eKlkrHh0dHVk4KgwdDB0MDAwMHwEfAQEr + WTEeK1kxHh4qODEdHR0dOFMqHQwdDAwMDAofAR8BAVM4Kx4kMlkjHipTMR0eHR1ZOCoMHQwMHQoMCh8B + HwEkOFkkHh5ZOCQeSzhTHh0dIzJZKgwdDB0MDAwKHx8BAStTOB4BHjEyUh4qOFkxIyMrWTgdHQwdDAwM + DAofAR8BMVkrAR4eK1k4HipTMTJZMlk4TB0dDB0MDAwMCh8BHwErKyQeHh4BKioBKlkrHikqKiMdHQwd + DAwdCgoKHwEBAQEBHgEeHh4eHh0rOFIdHh0dHR0MHQwdCgwMCgofAR8BAQEBHh4eHh4eHipTMR0dHR0d + HR0dDB0MHQoMCh8BHwEBAR4BHh4eHh4dKlkxHh0dHR0dHQwdDAwMDAwKHwEBAQEBHgEeHh4eHR4kMSod + HR0dHR0dDB0MHQoMDAofAR8BAQEBHh4eHh4eHh0eHh0eHR0dHQwdDB0MDAwMCh8BAQEBAR4eHh4eHh4d + Hh0dHR0dHR0dHQwdCgwMDAoKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoAAAAEAAAACAAAAABAAgAAAAAAAABAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAgAAAgAAAAICAAIAAAACAAIAAgIAAAMDAwADA3MAA8MqmAAQEBAAICAgADAwMABER + EQAWFhYAHBwcACIiIgApKSkAVVVVAE1NTQBCQkIAOTk5AIB8/wBQUP8AkwDWAP/szADG1u8A1ufnAJCp + rQAAADMAAABmAAAAmQAAAMwAADMAAAAzMwAAM2YAADOZAAAzzAAAM/8AAGYAAABmMwAAZmYAAGaZAABm + zAAAZv8AAJkAAACZMwAAmWYAAJmZAACZzAAAmf8AAMwAAADMMwAAzGYAAMyZAADMzAAAzP8AAP9mAAD/ + mQAA/8wAMwAAADMAMwAzAGYAMwCZADMAzAAzAP8AMzMAADMzMwAzM2YAMzOZADMzzAAzM/8AM2YAADNm + MwAzZmYAM2aZADNmzAAzZv8AM5kAADOZMwAzmWYAM5mZADOZzAAzmf8AM8wAADPMMwAzzGYAM8yZADPM + zAAzzP8AM/8zADP/ZgAz/5kAM//MADP//wBmAAAAZgAzAGYAZgBmAJkAZgDMAGYA/wBmMwAAZjMzAGYz + ZgBmM5kAZjPMAGYz/wBmZgAAZmYzAGZmZgBmZpkAZmbMAGaZAABmmTMAZplmAGaZmQBmmcwAZpn/AGbM + AABmzDMAZsyZAGbMzABmzP8AZv8AAGb/MwBm/5kAZv/MAMwA/wD/AMwAmZkAAJkzmQCZAJkAmQDMAJkA + AACZMzMAmQBmAJkzzACZAP8AmWYAAJlmMwCZM2YAmWaZAJlmzACZM/8AmZkzAJmZZgCZmZkAmZnMAJmZ + /wCZzAAAmcwzAGbMZgCZzJkAmczMAJnM/wCZ/wAAmf8zAJnMZgCZ/5kAmf/MAJn//wDMAAAAmQAzAMwA + ZgDMAJkAzADMAJkzAADMMzMAzDNmAMwzmQDMM8wAzDP/AMxmAADMZjMAmWZmAMxmmQDMZswAmWb/AMyZ + AADMmTMAzJlmAMyZmQDMmcwAzJn/AMzMAADMzDMAzMxmAMzMmQDMzMwAzMz/AMz/AADM/zMAmf9mAMz/ + mQDM/8wAzP//AMwAMwD/AGYA/wCZAMwzAAD/MzMA/zNmAP8zmQD/M8wA/zP/AP9mAAD/ZjMAzGZmAP9m + mQD/ZswAzGb/AP+ZAAD/mTMA/5lmAP+ZmQD/mcwA/5n/AP/MAAD/zDMA/8xmAP/MmQD/zMwA/8z/AP// + MwDM/2YA//+ZAP//zABmZv8AZv9mAGb//wD/ZmYA/2b/AP//ZgAhAKUAX19fAHd3dwCGhoYAlpaWAMvL + ywCysrIA19fXAN3d3QDj4+MA6urqAPHx8QD4+PgA8Pv/AKSgoACAgIAAAAD/AAD/AAAA//8A/wAAAP8A + /wD//wAA////AB8fAQEBHh4eHh0dHR0dDAsfHwEBAR4eRUQeRB0dHQwLHwEBAQFF9P//8QcdHR0MCx8B + AQEBk/RFHP9uHR0dDAsfAQEBAe4HHkT/RB0dHQsLHwEBAQGT9ERE/0QdHQwLCx8BAQEeRPT08P9EHR0M + CwsfAQEBAQFEk+50Ix0dDAsLHwEBASsyHh44ODgrHQwLCx8BAQEyOCQeOCMjOB0MCwsBAQEkMioxHTgj + HTgjDAsLAQEBMSsBOCM4MTEyHQwLCgEBATEBHiokOCsxIh0LCwoBAQEBHh4eHTgjHR0MCwsKAQEBHh4e + Hh0xIx0dDAsLCgEBAR4eHh4dHR0dHQwLCwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + + + \ No newline at end of file diff --git a/Libraries/WindowsAPICodePack/Shell/WindowsAPICodePack_Shell.csproj b/Libraries/WindowsAPICodePack/Shell/WindowsAPICodePack_Shell.csproj index 127042c..bcaeca6 100644 --- a/Libraries/WindowsAPICodePack/Shell/WindowsAPICodePack_Shell.csproj +++ b/Libraries/WindowsAPICodePack/Shell/WindowsAPICodePack_Shell.csproj @@ -253,12 +253,6 @@ - - - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57} - WindowsAPICodePack_Core - - @@ -295,6 +289,12 @@ true + + + {2e1fb0df-f9bb-4909-9f32-2d9d022a8e57} + WindowsAPICodePack_Core + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/T7EBackground/App.config b/T7EBackground/App.config new file mode 100644 index 0000000..3deeecd --- /dev/null +++ b/T7EBackground/App.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/T7EBackground/Primary.Designer.cs b/T7EBackground/Primary.Designer.cs index c70dbca..e95c392 100644 --- a/T7EBackground/Primary.Designer.cs +++ b/T7EBackground/Primary.Designer.cs @@ -33,12 +33,12 @@ private void InitializeComponent() this.TrayIconContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.TrayIconContextMenuOpenSettings = new System.Windows.Forms.ToolStripMenuItem(); this.visitTheOfficialWebsiteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.donateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.updateToVersion0ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.TrayIconContextMenuExit = new System.Windows.Forms.ToolStripMenuItem(); this.UpdateTimer = new System.Windows.Forms.Timer(this.components); this.DonateTimer = new System.Windows.Forms.Timer(this.components); - this.donateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.TrayIconContextMenuStrip.SuspendLayout(); this.SuspendLayout(); // @@ -60,28 +60,37 @@ private void InitializeComponent() this.toolStripSeparator1, this.TrayIconContextMenuExit}); this.TrayIconContextMenuStrip.Name = "TrayIconContextMenuStrip"; - this.TrayIconContextMenuStrip.Size = new System.Drawing.Size(232, 142); + this.TrayIconContextMenuStrip.Size = new System.Drawing.Size(203, 142); // // TrayIconContextMenuOpenSettings // this.TrayIconContextMenuOpenSettings.Font = new System.Drawing.Font("Tahoma", 8.400001F, System.Drawing.FontStyle.Bold); this.TrayIconContextMenuOpenSettings.Name = "TrayIconContextMenuOpenSettings"; - this.TrayIconContextMenuOpenSettings.Size = new System.Drawing.Size(231, 22); + this.TrayIconContextMenuOpenSettings.Size = new System.Drawing.Size(202, 22); this.TrayIconContextMenuOpenSettings.Text = "&Open Settings"; this.TrayIconContextMenuOpenSettings.Click += new System.EventHandler(this.TrayIconContextMenuOpenSettings_Click); // // visitTheOfficialWebsiteToolStripMenuItem // this.visitTheOfficialWebsiteToolStripMenuItem.Name = "visitTheOfficialWebsiteToolStripMenuItem"; - this.visitTheOfficialWebsiteToolStripMenuItem.Size = new System.Drawing.Size(231, 22); + this.visitTheOfficialWebsiteToolStripMenuItem.Size = new System.Drawing.Size(202, 22); this.visitTheOfficialWebsiteToolStripMenuItem.Text = "&Visit the Official Website"; + this.visitTheOfficialWebsiteToolStripMenuItem.Visible = false; this.visitTheOfficialWebsiteToolStripMenuItem.Click += new System.EventHandler(this.visitTheOfficialWebsiteToolStripMenuItem_Click); // + // donateToolStripMenuItem + // + this.donateToolStripMenuItem.Name = "donateToolStripMenuItem"; + this.donateToolStripMenuItem.Size = new System.Drawing.Size(202, 22); + this.donateToolStripMenuItem.Text = "&Donate"; + this.donateToolStripMenuItem.Visible = false; + this.donateToolStripMenuItem.Click += new System.EventHandler(this.donateToolStripMenuItem_Click); + // // updateToVersion0ToolStripMenuItem // this.updateToVersion0ToolStripMenuItem.Enabled = false; this.updateToVersion0ToolStripMenuItem.Name = "updateToVersion0ToolStripMenuItem"; - this.updateToVersion0ToolStripMenuItem.Size = new System.Drawing.Size(231, 22); + this.updateToVersion0ToolStripMenuItem.Size = new System.Drawing.Size(202, 22); this.updateToVersion0ToolStripMenuItem.Text = "&Update to Version {0}"; this.updateToVersion0ToolStripMenuItem.Visible = false; this.updateToVersion0ToolStripMenuItem.Click += new System.EventHandler(this.updateToVersion0ToolStripMenuItem_Click); @@ -89,12 +98,12 @@ private void InitializeComponent() // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(228, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(199, 6); // // TrayIconContextMenuExit // this.TrayIconContextMenuExit.Name = "TrayIconContextMenuExit"; - this.TrayIconContextMenuExit.Size = new System.Drawing.Size(231, 22); + this.TrayIconContextMenuExit.Size = new System.Drawing.Size(202, 22); this.TrayIconContextMenuExit.Text = "E&xit"; this.TrayIconContextMenuExit.Click += new System.EventHandler(this.TrayIconContextMenuExit_Click); // @@ -108,18 +117,12 @@ private void InitializeComponent() this.DonateTimer.Interval = 1800000; this.DonateTimer.Tick += new System.EventHandler(this.DonateTimer_Tick); // - // donateToolStripMenuItem - // - this.donateToolStripMenuItem.Name = "donateToolStripMenuItem"; - this.donateToolStripMenuItem.Size = new System.Drawing.Size(231, 22); - this.donateToolStripMenuItem.Text = "&Donate"; - this.donateToolStripMenuItem.Click += new System.EventHandler(this.donateToolStripMenuItem_Click); - // // Primary // - this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(292, 268); + this.ClientSize = new System.Drawing.Size(219, 218); + this.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this.Name = "Primary"; this.Text = "Primary"; this.WindowState = System.Windows.Forms.FormWindowState.Minimized; diff --git a/T7EBackground/Primary.cs b/T7EBackground/Primary.cs index d3a307e..3e0f0ec 100644 --- a/T7EBackground/Primary.cs +++ b/T7EBackground/Primary.cs @@ -32,6 +32,8 @@ public partial class Primary : Form Dictionary[] Window_AppPairsChangesList = new Dictionary[2]; + Dictionary TempShortcut_AppIdPairs = new Dictionary(); + static TextWriter LogTxtFile; #region Start-Up @@ -54,7 +56,8 @@ private void HookAppList() /// private void HookShortcut() { - + if (DisableShortcutHooking) return; + string basePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft\\Internet Explorer\\Quick Launch\\User Pinned"); CommonLog("Hooking " + basePath + " for DirectoryName and FileName changes"); @@ -64,6 +67,7 @@ private void HookShortcut() LnkWatcher.Filter = "*.lnk"; LnkWatcher.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.FileName; LnkWatcher.Created += new FileSystemEventHandler(lnkWatcher_Created); + LnkWatcher.Deleted += new FileSystemEventHandler(LnkWatcher_Deleted); LnkWatcher.EnableRaisingEvents = true; CommonLog("Registered shortcut hook on " + basePath); @@ -91,6 +95,8 @@ private static void HookWindows() /// private void HookUpdate() { + return; // dummying out + CommonLog("Hooking " + Common.Path_AppData + "\\UpdateCheck2.txt for LastWrite changes"); UpdateWatcher.Path = Common.Path_AppData; @@ -104,6 +110,8 @@ private void HookUpdate() private void StartUpdateTimer() { + return; // dummying out + CommonLog("Starting update timer"); UpdateTimer.Start(); } @@ -129,6 +137,9 @@ public Primary() // Initialize variables Common.WindowHandle_Primary = this.Handle; + DisableShortcutChanging = false;// (Environment.OSVersion.Version.Major >= 10); + DisableShortcutHooking = false;// DisableShortcutChanging; + // Sets handler for Ctrl+C on console Interop.SetConsoleCtrlHandler(new Interop.ConsoleCtrlDelegate(ConsoleCtrlCheck), true); @@ -233,6 +244,8 @@ private void TrayIconContextMenuOpenSettings_Click(object sender, EventArgs e) /// private void CheckUpdateString() { + return; // dummying out + CheckUpdateString(true); } @@ -242,6 +255,8 @@ private void CheckUpdateString() /// Download UpdateCheck2.txt from the web server private void CheckUpdateString(bool download) { + return; //dummying out + // Download the file, first. This is on a new thread; it won't affect nothing(?) if (download) { @@ -311,14 +326,25 @@ private void updateToVersion0ToolStripMenuItem_Click(object sender, EventArgs e) private void UpdateTimer_Tick(object sender, EventArgs e) { + return; // dummying out + ShowDonateBalloon(); // Check UpdateCheck2.txt CheckUpdateString(); } + private void ShowPinBalloon() + { + TrayIcon.BalloonTipIcon = ToolTipIcon.Info; + TrayIcon.BalloonTipTitle = "Repin the app when it is running"; + TrayIcon.BalloonTipText = "Duplicate icons may appear."; + } + private void ShowDonateBalloon() { + return; // dummying out + // Show donate dialog DateTime installDate = DateTime.Today; bool installUpgrade = false; @@ -342,6 +368,8 @@ private void ShowDonateBalloon() private void UpdateWatcher_Changed(object sender, EventArgs e) { + return; // dummying out + // Check UpdateCheck2.txt, newly written CheckUpdateString(false); } @@ -374,6 +402,9 @@ private void UnhookAppList() /// private void UnhookShortcut() { + // remove if we will detect lnks for tray balloon prompt + if (DisableShortcutHooking) return; + CommonLog("3. Unhook LNK watcher"); LnkWatcher.EnableRaisingEvents = false; LnkWatcher.Dispose(); @@ -395,6 +426,7 @@ private static void CleanUp_Ctrl() /// private void CleanUp() { + T7EBackground.Program.CleaningUp = true; CommonLog("Closing app; cleaning up...", 1); UnhookWindows(); @@ -472,6 +504,9 @@ public string GetLogAppString(string processName, string appId) } static public int LogIndentLevel = 0; + private bool DisableShortcutChanging; + + public bool DisableShortcutHooking { get; private set; } static public void CommonLog(string messageString) { diff --git a/T7EBackground/Primary_Shortcuts.cs b/T7EBackground/Primary_Shortcuts.cs index 3d5b7f2..dd3ed07 100644 --- a/T7EBackground/Primary_Shortcuts.cs +++ b/T7EBackground/Primary_Shortcuts.cs @@ -19,6 +19,8 @@ public partial class Primary /// Compare list to compare to private void CheckShortcutsAddedAppIds(List shortcutList, Dictionary[] changesList) { + if (DisableShortcutChanging) return; + Dictionary compareList; if (changesList[0].Count > 0) compareList = changesList[0]; @@ -58,51 +60,59 @@ private void CheckShortcutsAddedAppIds(List shortcutList, Dictionary 3 && lnkAppId.Substring(0, 3).Equals("T7E")) + if (Environment.OSVersion.Version.Major >= 10) { - CommonLog("Shortcut has existing T7E AppId: " + lnkAppId); - CommonLog("Copying original if it exists"); - - // It's tampered. Copy over original to User Pinned - if (File.Exists(origLnkPath)) - File.Copy(origLnkPath, lnkPath, true); + CommonLog("Assigning app ID to pinned shortcut."); + Common.TaskbarManagerInstance.SetApplicationIdForShortcut(lnkPath, appId); } else { - CommonLog("Shortcut is original, unmodified."); - if (lnkAppId.Length > 3) - CommonLog("Shortcut has its own AppId: " + lnkAppId); + // Is shortcut original, or tampered? Check its appId for T7E + string lnkAppId = Common.TaskbarManagerInstance.GetApplicationIdForShortcut(lnkPath); + string lnkFilename = Path.GetFileName(lnkPath); - // It's original. Copy the original to appdata - File.Copy(lnkPath, origLnkPath, true); - } + // Get the LNK paths + string origLnkPath = Path.Combine(Common.Path_AppData, "OrigProperties\\" + lnkFilename); + string modifiedLnkPath = Path.Combine(Common.Path_AppData, appId + "\\" + lnkFilename); + if (lnkAppId.Length > 3 && lnkAppId.Substring(0, 3).Equals("T7E")) + { + CommonLog("Shortcut has existing T7E AppId: " + lnkAppId); + CommonLog("Copying original if it exists"); - // Apply T7E appId to modifiedLnkPath - if (!File.Exists(modifiedLnkPath)) - { - CommonLog("Modified shortcut backup does not exist -- creating."); - File.Copy(lnkPath, modifiedLnkPath, true); - Common.TaskbarManagerInstance.SetApplicationIdForShortcut(modifiedLnkPath, appId); - } + // It's tampered. Copy over original to User Pinned + if (File.Exists(origLnkPath)) + File.Copy(origLnkPath, lnkPath, true); + } + else + { + CommonLog("Shortcut is original, unmodified."); + if (lnkAppId.Length > 3) + CommonLog("Shortcut has its own AppId: " + lnkAppId); + + // It's original. Copy the original to appdata + File.Copy(lnkPath, origLnkPath, true); + } - // Pin modifiedLnkPath shortcut - CommonLog("Copying modified shortcut to pinned."); - /*UnpinShortcut(lnkPath); - if (lnkPath.LastIndexOf("StartMenu") > 0) - PinShortcut(modifiedLnkPath, true); - else - PinShortcut(modifiedLnkPath, false);*/ - // I can just copy over the modified LNK. The jumplist will show. - File.Copy(modifiedLnkPath, lnkPath, true); + + // Apply T7E appId to modifiedLnkPath + if (!File.Exists(modifiedLnkPath)) + { + CommonLog("Modified shortcut backup does not exist -- creating."); + File.Copy(lnkPath, modifiedLnkPath, true); + Common.TaskbarManagerInstance.SetApplicationIdForShortcut(modifiedLnkPath, appId); + } + + // Pin modifiedLnkPath shortcut + CommonLog("Copying modified shortcut to pinned."); + /*UnpinShortcut(lnkPath); + if (lnkPath.LastIndexOf("StartMenu") > 0) + PinShortcut(modifiedLnkPath, true); + else + PinShortcut(modifiedLnkPath, false);*/ + // I can just copy over the modified LNK. The jumplist will show. + File.Copy(modifiedLnkPath, lnkPath, true); + } CommonLog("Finished checking appid.", -1); @@ -123,6 +133,8 @@ private void CheckShortcutsAddedAppIds(List shortcutList, DictionaryCompare list to compare to private void CheckShortcutsDeletedAppIds(List shortcutList, Dictionary[] changesList) { + if (DisableShortcutChanging) return; + if (changesList[1].Count > 0) { Dictionary deletedList = new Dictionary(); @@ -155,27 +167,35 @@ private void CheckShortcutsDeletedAppIds(List shortcutList, Dictionary= 10) { - CommonLog("Pinning/Unpinning original shortcut"); - - // Pin original shortcut - UnpinShortcut(lnkPath); - if (lnkPath.LastIndexOf("StartMenu") > 0) - PinShortcut(origLnkPath, true); - else - PinShortcut(origLnkPath, false); - //File.Copy(origLnkPath, lnkPath, true); - //File.Delete(origLnkPath); + CommonLog("Removing application ID from original shortcut"); + Common.TaskbarManagerInstance.SetApplicationIdForShortcut(lnkPath, ""); } else { - CommonLog("Original shortcut backup does not exist, creating blank AppId shortcut"); - // If it doesn't exist, just remove T7E from lnkPath - string tmpLnkPath = Path.Combine(Path.GetTempPath(), lnkFilename); - File.Copy(lnkPath, tmpLnkPath, true); - Common.TaskbarManagerInstance.SetApplicationIdForShortcut(tmpLnkPath, ""); - origLnkPath = tmpLnkPath; + if (File.Exists(origLnkPath)) + { + CommonLog("Pinning/Unpinning original shortcut"); + + // Pin original shortcut + UnpinShortcut(lnkPath); + if (lnkPath.LastIndexOf("StartMenu") > 0) + PinShortcut(origLnkPath, true); + else + PinShortcut(origLnkPath, false); + //File.Copy(origLnkPath, lnkPath, true); + //File.Delete(origLnkPath); + } + else + { + CommonLog("Original shortcut backup does not exist, creating blank AppId shortcut"); + // If it doesn't exist, just remove T7E from lnkPath + string tmpLnkPath = Path.Combine(Path.GetTempPath(), lnkFilename); + File.Copy(lnkPath, tmpLnkPath, true); + Common.TaskbarManagerInstance.SetApplicationIdForShortcut(tmpLnkPath, ""); + origLnkPath = tmpLnkPath; + } } CommonLog(-1); @@ -201,12 +221,28 @@ public string GetStringResource(IntPtr hModuleInstance, uint uiStringID) private void UnpinShortcut(string lnkPath) { + // If lnk is on a network dir, it needs to be copied to local temp + // Windows remembers which shortcuts are pinned to taskbar + if (!File.Exists(lnkPath)) return; + + if (DisableShortcutChanging) return; + + string tempLnkPath = ""; + if (Interop.PathIsNetworkPath(lnkPath)) + { + tempLnkPath = Path.Combine(Path.GetTempPath(), Path.GetFileName(lnkPath)); + File.Copy(lnkPath, tempLnkPath); + lnkPath = tempLnkPath; + + if (!File.Exists(lnkPath)) return; + } + // Unpinning shortcuts is under UnpinShortcut() IntPtr shell32Module = Interop.GetModuleHandle("shell32.dll"); string command; if (lnkPath.Contains("StartMenu")) - command = GetStringResource(shell32Module, 5382); // Unpin from Start Men&u + command = GetStringResource(shell32Module, 5382); // Unpin from Start Men&u // win8+: 51394 else command = GetStringResource(shell32Module, 5387); // Unpin from Tas&kbar @@ -218,17 +254,36 @@ private void UnpinShortcut(string lnkPath) "", "", Interop.ShowCommands.SW_HIDE); + + if (File.Exists(tempLnkPath)) File.Delete(tempLnkPath); } private void PinShortcut(string lnkPath, bool pinStartMenu) { + // If lnk is on a network dir, it needs to be copied to local temp + // Windows remembers which shortcuts are pinned to taskbar + // Does T7EBackground need to be local too??? + if (!File.Exists(lnkPath)) return; + + if (DisableShortcutChanging) return; + + string tempLnkPath = ""; + if(Interop.PathIsNetworkPath(lnkPath)) + { + tempLnkPath = Path.Combine(Path.GetTempPath(), Path.GetFileName(lnkPath)); + File.Copy(lnkPath, tempLnkPath); + lnkPath = tempLnkPath; + + if (!File.Exists(lnkPath)) return; + } + LnkWatcher.EnableRaisingEvents = false; IntPtr shell32Module = Interop.GetModuleHandle("shell32.dll"); string command; if (pinStartMenu) - command = GetStringResource(shell32Module, 5381); // Pin to Start Men&u + command = GetStringResource(shell32Module, 5381); // Pin to Start Men&u // win8+: 51201 else command = GetStringResource(shell32Module, 5386); // Pin to Tas&kbar @@ -243,6 +298,130 @@ private void PinShortcut(string lnkPath, bool pinStartMenu) if (LnkWatcher.Path.Length > 0) LnkWatcher.EnableRaisingEvents = true; + + if (File.Exists(tempLnkPath)) File.Delete(tempLnkPath); + } + + private void UnpinTempShortcut(IntPtr hWnd, string appId) + { + if (DisableShortcutChanging) return; + + string hwndProcessPath = ""; + string hwndProcessName = ""; + string tempLnkPath = ""; + + if(!IntPtr.Equals(hWnd, IntPtr.Zero)) + { + // Get process ID from window + int hwndPid; + Interop.GetWindowThreadProcessId(hWnd, out hwndPid); + + // Get process handle from pID; get process path from handle + IntPtr hwndPidHandle = Interop.OpenProcess(Interop.ProcessAccess.QueryInformation | Interop.ProcessAccess.VMRead, false, hwndPid); + StringBuilder hwndProcessNameString = new StringBuilder(260); + Interop.GetModuleFileNameEx(hwndPidHandle, IntPtr.Zero, hwndProcessNameString, 260); + Interop.CloseHandle(hwndPidHandle); + + try { hwndProcessPath = hwndProcessNameString.ToString(); } + catch (Exception e) { return; } + + if (!File.Exists(hwndProcessPath)) return; + + hwndProcessName = Path.GetFileNameWithoutExtension(hwndProcessPath).ToLower(); + + tempLnkPath = Path.Combine(Common.Path_AppData, "TempShortcuts" + "\\" + hwndProcessName + ".lnk"); + } + else + { + // Get lnk from appId + foreach (KeyValuePair lnkPair in TempShortcut_AppIdPairs) + { + string lnkName = lnkPair.Key; + string lnkAppId = lnkPair.Value; + + if (appId == lnkAppId) + { + hwndProcessName = Path.GetFileNameWithoutExtension(lnkName).ToLower(); + tempLnkPath = lnkName; + } + } + } + + if (!IsAppPinnedByProcessName(hwndProcessName)) return; + + if (File.Exists(tempLnkPath)) + { + if (TempShortcut_AppIdPairs.ContainsKey(tempLnkPath)) + TempShortcut_AppIdPairs.Remove(tempLnkPath); + + UnpinShortcut(tempLnkPath); + File.Delete(tempLnkPath); + } + + } + + private void PinTempShortcutFromHwnd(IntPtr hWnd, string appId) + { + if (DisableShortcutChanging) return; + + // Get process ID from window + int hwndPid; + Interop.GetWindowThreadProcessId(hWnd, out hwndPid); + + // Get process handle from pID; get process path from handle + IntPtr hwndPidHandle = Interop.OpenProcess(Interop.ProcessAccess.QueryInformation | Interop.ProcessAccess.VMRead, false, hwndPid); + StringBuilder hwndProcessNameString = new StringBuilder(260); + Interop.GetModuleFileNameEx(hwndPidHandle, IntPtr.Zero, hwndProcessNameString, 260); + Interop.CloseHandle(hwndPidHandle); + + string hwndProcessPath; + try { hwndProcessPath = hwndProcessNameString.ToString(); } + catch (Exception e) { return; } + + if (!File.Exists(hwndProcessPath)) return; + + string hwndProcessName = Path.GetFileNameWithoutExtension(hwndProcessPath).ToLower(); + + if(IsAppPinnedByProcessName(hwndProcessName)) return; + + string newLnkPath = Path.Combine(Common.Path_AppData, "TempShortcuts" + "\\" + hwndProcessName + ".lnk"); + + using (ShellLink shortcut = new ShellLink()) + { + shortcut.Target = hwndProcessPath; + shortcut.WorkingDirectory = Path.GetDirectoryName(hwndProcessPath); + shortcut.Description = hwndProcessName; + shortcut.DisplayMode = ShellLink.LinkDisplayMode.edmNormal; + shortcut.Save(newLnkPath); + } + + Common.TaskbarManagerInstance.SetApplicationIdForShortcut(newLnkPath, appId); + + if (TempShortcut_AppIdPairs.ContainsKey(newLnkPath)) + TempShortcut_AppIdPairs.Remove(newLnkPath); + TempShortcut_AppIdPairs.Add(newLnkPath, appId); + + PinShortcut(newLnkPath, false); + } + + private bool IsAppPinnedByProcessName(string processName) + { + if (processName.Length < 1) return false; + + // Check for all shortcuts under %appdata%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar and StartMenu + List shortcutList = new List(); + string userPinnedPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft\\Internet Explorer\\Quick Launch\\User Pinned"); + DirectoryInfo di = new DirectoryInfo(userPinnedPath); + FileInfo[] lnkInfo = di.GetFiles("*.lnk", SearchOption.AllDirectories); + + foreach (FileInfo lnk in lnkInfo) + { + string targetName = Path.GetFileNameWithoutExtension(Common.ResolveLnkPath(lnk.FullName)).ToLower(); + + if (processName.ToLower() == targetName) return true; + } + + return false; } /// @@ -280,9 +459,11 @@ private void AssignAppIdsToShortcuts(string shortcutPath) /// Two-part Dictionary array, consisting of added AppIds and deleted AppIds private void AssignAppIdsToShortcuts(string shortcutPath, Dictionary[] changesList) { + if (DisableShortcutChanging) return; + CommonLog("Assigning AppIds to User Pinned shortcuts", 1); - // First, populate shortcutList with all shortcuts we want to check + // First, populate shortcutList with all shortcutrs we want to check List shortcutList = new List(); if (File.Exists(shortcutPath)) shortcutList.Add(shortcutPath); // Only check for this @@ -322,13 +503,43 @@ private void lnkWatcher_Created(object sender, FileSystemEventArgs e) else return; } + //System.Windows.Forms.MessageBox.Show(Common.TaskbarManagerInstance.GetApplicationIdForShortcut(e.FullPath)); + CommonLog("Detected new shortcut: " + e.FullPath, 1); // Assign appid to last created shortcut - AssignAppIdsToShortcuts(e.FullPath); + if (!DisableShortcutChanging) + AssignAppIdsToShortcuts(e.FullPath); CommonLog("Finished handling new shortcut.", 0); } + + + private void LnkWatcher_Deleted(object sender, FileSystemEventArgs e) + { + // We need to assign a blank appid to any open windows + // and, if not win10 rtm, then reassign the appid + + /* + // Check if lnk file is in temp pinned list; if so, repin. + // Jump list removals should result in removal from pin list before this event is called + + foreach (KeyValuePair lnkPair in TempShortcut_AppIdPairs) + { + string lnkName = lnkPair.Key; + string appId = lnkPair.Value; + + // We need to assign a blank appid to any open windows + // and, if not win10 rtm, then reassign the appid + + if(Path.GetFileNameWithoutExtension(e.FullPath) == Path.GetFileNameWithoutExtension(lnkName)) + { + PinShortcut(lnkName, false); + } + } + */ + } + #endregion + } } -} diff --git a/T7EBackground/Primary_Windows.cs b/T7EBackground/Primary_Windows.cs index 8669700..e7c9049 100644 --- a/T7EBackground/Primary_Windows.cs +++ b/T7EBackground/Primary_Windows.cs @@ -88,6 +88,11 @@ private void CheckWindowAddedAppIds(IntPtr hWnd, Dictionary[] ch CommonLog("Applying AppId"); Common.TaskbarManagerInstance.SetApplicationIdForSpecificWindow(hWnd, appId); + // Win10 RTM: Pin shortcut here if no shortcut exists + // Doesn't work + //if (Environment.OSVersion.Version.Major == 10 && Environment.OSVersion.Version.Build < 10586) + // PinTempShortcutFromHwnd(hWnd, appId); + CommonLog("Done checking window!", -1); break; // Since a window belongs to only one appId @@ -150,6 +155,11 @@ private void CheckWindowDeletedAppIds(IntPtr hWnd, Dictionary[] c //Thread.Sleep(250); Interop.ShowWindow(hWnd, 5); + // Win10 RTM: Unpin shortcut here + // doesn't work + //if(Environment.OSVersion.Version.Major == 10 && Environment.OSVersion.Version.Build < 10586) + // UnpinTempShortcut(hWnd, origAppId); + CommonLog("Finished checking AppId.", -1); break; // Since a window belongs to only one appId @@ -222,6 +232,26 @@ private void AssignAppIdsToWindows(IntPtr hwnd, Dictionary[] cha } } + public string GetWindowProcessPath(IntPtr hWnd) + { + // Get process ID from window + int hwndPid; + Interop.GetWindowThreadProcessId(hWnd, out hwndPid); + + StringBuilder hwndProcessNameString = new StringBuilder(Interop.MAX_PATH); + IntPtr processHandle = IntPtr.Zero; + try + { + processHandle = Interop.OpenProcess(Interop.ProcessAccess.QueryInformationLimited, false, hwndPid); + uint pathLength = 260; + Interop.QueryFullProcessImageName(processHandle, 0, hwndProcessNameString, ref pathLength); + Interop.CloseHandle(processHandle); + + return hwndProcessNameString.ToString(); + } + catch (Exception e) { Interop.CloseHandle(processHandle); return ""; } + } + /// /// The main procedure for assigning AppId to window. Takes one hWnd and checks it against changesList /// @@ -268,16 +298,39 @@ public void AssignAppIdsToWindow(IntPtr hWnd, Dictionary[] chang /// protected override void WndProc(ref Message m) { - if (m.Msg == WM_ShellHook && (int)m.WParam == 1) // HSHELL_WINDOWCREATED + if (m.Msg == WM_ShellHook) { - CommonLog("Detected new window.", 1); + if ((int)m.WParam == 1) // HSHELL_WINDOWCREATED + { + CommonLog("Detected new window.", 1); - // Do I want this to be multithreaded? Possible limitation: AssignAppIdsToWindows - // creates a new AppWindow. Can I cancel the AssignAppIdsToWindows thread??? - //Thread matchWindowThread = new Thread(new ParameterizedThreadStart(AssignAppIdsToWindows)); - AssignAppIdsToWindows(m.LParam); + // Do I want this to be multithreaded? Possible limitation: AssignAppIdsToWindows + // creates a new AppWindow. Can I cancel the AssignAppIdsToWindows thread??? + //Thread matchWindowThread = new Thread(new ParameterizedThreadStart(AssignAppIdsToWindows)); + if (System.Environment.OSVersion.Version.Major == 10 && Environment.OSVersion.Version.Minor < 10586) + { + //if (IsAppPinnedByProcessName(Path.GetFileNameWithoutExtension(GetWindowProcessPath(m.LParam)))) + AssignAppIdsToWindows(m.LParam); + } + else + { + AssignAppIdsToWindows(m.LParam); + } + + // Win10 RTM: If window does not have a pinned shortcut, then pin it. Monitor for window closing then delete the shortcut + // The temp pinning is a workaround as jump lists do not work for unpinned shortcuts (the list is displayed, but actions don't do anything. + // This workaround is unnecessary in TH2 (build 10586) as the OS bug is fixed. - CommonLog("Finished handling created window.", 0); + CommonLog("Finished handling created window.", 0); + } + else if((int)m.WParam == 2) // HSHELL_WINDOWDESTROYED + { + // Win10 RTM: Unpin shortcut when windows is closed + // doesn't work + //System.OperatingSystem osInfo = System.Environment.OSVersion; + //if (osInfo.Version.Major == 10 && (osInfo.Version.Build < 10586)) + // UnpinTempShortcut(m.LParam, ""); + } } base.WndProc(ref m); diff --git a/T7EBackground/Program.cs b/T7EBackground/Program.cs index a43a11c..bbe67b8 100644 --- a/T7EBackground/Program.cs +++ b/T7EBackground/Program.cs @@ -6,11 +6,16 @@ using System.Runtime.InteropServices; using System.IO; using T7ECommon; +using System.Threading; +using System.Diagnostics; namespace T7EBackground { static class Program { + static Mutex mutex = new Mutex(true, "{7124FFA4-A77D-415A-A102-B019BA4756F7}"); + public static bool CleaningUp = false; + static void Main() { // Do file/directory checks @@ -23,23 +28,45 @@ static void Main() // Do file/directory checks Common.CheckFiles(); + // Check if another process of the same name exists + + //////////////////////// // Start running the app. If DEBUG, run without exception logging. // If RELEASE, then yes, put it in a try{}catch{} block. - Application.EnableVisualStyles(); + if (mutex.WaitOne(TimeSpan.Zero, true)) + { + try { + Application.EnableVisualStyles(); -#if DEBUG - Application.Run(new Primary()); - return; -#endif + //#if RELEASE + Application.Run(new Primary()); + mutex.ReleaseMutex(); + } catch(Exception e) + { + mutex.ReleaseMutex(); - try { Application.Run(new Primary()); } + if (!CleaningUp) + { + Process.Start(Application.ExecutablePath); + Environment.Exit(-1); + } + } + } + else + { + return; + } +//#endif +/* + try { throw new NotImplementedException(); Application.Run(new Primary()); } catch (Exception e) { Common.SendExceptionLog(e, "T7EBackground"); Environment.Exit(-1); } + */ } } diff --git a/T7EBackground/T7EBackground.csproj b/T7EBackground/T7EBackground.csproj index d2f5c6f..d7f40bb 100644 --- a/T7EBackground/T7EBackground.csproj +++ b/T7EBackground/T7EBackground.csproj @@ -59,8 +59,9 @@ true false + - true + app.manifest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/T7ECommon/App.config b/T7ECommon/App.config new file mode 100644 index 0000000..3deeecd --- /dev/null +++ b/T7ECommon/App.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/T7ECommon/App.cs b/T7ECommon/App.cs index e8e4281..a8e0c00 100644 --- a/T7ECommon/App.cs +++ b/T7ECommon/App.cs @@ -231,7 +231,13 @@ static public string GetAppIdForProgramFile(string programFilePath) appIdHash.ComputeHash(new ASCIIEncoding().GetBytes(appIdHashSource)); // Build final appId - string appId = "JLE." + String.Format("{0:X}", appIdHash.CrcValue) + "_" + Path.GetFileNameWithoutExtension(programFilePath).ToLower(); + string appId; + try { + appId = "JLE." + String.Format("{0:X}", appIdHash.CrcValue) + "_" + Path.GetFileNameWithoutExtension(programFilePath).ToLower(); + } catch(Exception e) + { + appId = ""; + } if (appId.Length > 1) return appId; diff --git a/T7ECommon/Interop.cs b/T7ECommon/Interop.cs index 7f031c9..004ff91 100644 --- a/T7ECommon/Interop.cs +++ b/T7ECommon/Interop.cs @@ -34,8 +34,8 @@ public enum CtrlTypes #endregion #region Window Hooks, Creation, and Enumeration - int PROCESS_QUERY_INFORMATION = 0x0400; - int PROCESS_VM_READ = 0x0010; + public const int PROCESS_QUERY_INFORMATION = 0x0400; + public const int PROCESS_VM_READ = 0x0010; [DllImport("user32")] public static extern uint @@ -97,6 +97,9 @@ public enum Cursors [DllImport("kernel32.dll", ExactSpelling = true, EntryPoint = "QueryFullProcessImageNameW", CharSet = CharSet.Unicode)] public static extern bool QueryFullProcessImageName(IntPtr hProcess, uint dwFlags, StringBuilder lpExeName, ref uint lpdwSize); + [DllImport("shlwapi.dll")] + public static extern bool PathIsNetworkPath(string pszPath); + [Flags()] public enum ProcessAccess : int { diff --git a/T7ECommon/Logging.cs b/T7ECommon/Logging.cs index 1abb3c5..d4682c7 100644 --- a/T7ECommon/Logging.cs +++ b/T7ECommon/Logging.cs @@ -14,8 +14,8 @@ public partial class Common { static string MailUserName = "jumplist.extender@gmail.com"; static string MailPassword = ""; //This must be filled in - static string MailRecipient = "digimarco35@yahoo.com"; - static string MailVersion = "v0.4"; + static string MailRecipient = "lapletapps+jlebugs@gmail.com"; + static string MailVersion = "v0.4-B"; static public void SendExceptionLog(Exception e) { @@ -35,8 +35,8 @@ static public void SendExceptionLog(Exception e, string appName, string appPath) static public void SendExceptionLog(Exception e, string appName, string appPath, string appWindowClassName, string appId) { DialogResult errSendResult = MessageBox.Show( - "Sorry -- Jumplist Extender reached a critical error, and has to close immediately." + Environment.NewLine - + "Could you send the below error report with just one click? It helps the developer GREATLY! Thanks!" + Environment.NewLine + Environment.NewLine + "Jumplist Extender reached a critical error and needs to close." + Environment.NewLine + + "Send the below error report directly to the developer, with one click?" + Environment.NewLine + Environment.NewLine + e.Message.ToString(), "Critical Error", MessageBoxButtons.YesNo, @@ -44,7 +44,7 @@ static public void SendExceptionLog(Exception e, string appName, string appPath, MessageBoxDefaultButton.Button1); if (errSendResult != DialogResult.Yes) return; - else { MessageBox.Show("Thanks! An error report will be sent.", + else { MessageBox.Show("Thanks! An error report will now be sent.", "Sending Mail", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); } @@ -81,13 +81,13 @@ static public void SendExceptionLog(Exception e, string appName, string appPath, catch (Exception ee) { MessageBox.Show("Email could not be sent: " + ee.Message + Environment.NewLine - + "Sorry, but thanks for your consideration! Click \"OK\" to exit.", + + "Click \"OK\" to exit.", "Email Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } - MessageBox.Show("Email sent! Thanks for your consideration! If this bug happens repeatedly, please file a bug report at\r\n\r\nhttp://code.google.com/p/jumplist-extender/issues/list\r\n\r\nor email me at digimarco35@yahoo.com." + MessageBox.Show("Email sent. If this crash happens repeatedly, please email the developer with additional information at lapletapps@gmail.com." + "\r\n\r\nClick \"OK\" to exit.", "Email Sent", MessageBoxButtons.OK, diff --git a/T7ECommon/Startup.cs b/T7ECommon/Startup.cs index 5f8373c..a456e05 100644 --- a/T7ECommon/Startup.cs +++ b/T7ECommon/Startup.cs @@ -5,6 +5,8 @@ using System.IO; using System.Diagnostics; using System.Reflection; +using Microsoft.Win32; +using System.Globalization; namespace T7ECommon { @@ -53,7 +55,27 @@ public static void CheckWindowsVersion() { System.OperatingSystem osInfo = System.Environment.OSVersion; if (osInfo.Version.Major < 6 || (osInfo.Version.Major == 6 && osInfo.Version.Minor < 1)) - Fail("Jumplist Extender cannot run on systems prior to Windows 7.", 1); + Fail("Jumplist Extender needs to be run on Windows 7 or later.", 1); + + // check net version, too. System.Core 3.5.0.0 + CheckNetVersion(); + } + + public static void CheckNetVersion() + { + if (Environment.Version.Major >= 4) return; // hopefully this does not fail in .NET 5+. + else + { + // is .NET 3.5 installed? + RegistryKey installed_versions = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP"); + string[] version_names = installed_versions.GetSubKeyNames(); + //version names start with 'v', eg, 'v3.5' which needs to be trimmed off before conversion + double Framework = Convert.ToDouble(version_names[version_names.Length - 1].Remove(0, 1), CultureInfo.InvariantCulture); + int SP = Convert.ToInt32(installed_versions.OpenSubKey(version_names[version_names.Length - 1]).GetValue("SP", 0)); + + if (Framework < 3.5) + Fail("Jumplist Extender needs .NET 3.5 or higher to be installed.", 1); + } } public static void CheckFiles() @@ -92,6 +114,10 @@ public static void CheckFiles() if (!Directory.Exists(appDataOrigPropertiesDir)) Directory.CreateDirectory(appDataOrigPropertiesDir); + string appDataTempShortcutsDir = Path.Combine(appDataDir, "TempShortcuts"); + if (!Directory.Exists(appDataTempShortcutsDir)) + Directory.CreateDirectory(appDataTempShortcutsDir); + // bug 68: fixes jump list imports when appDataDir\Icons\Imported does not exist string appDataIconsDir = Path.Combine(appDataDir, "Icons"); if (!Directory.Exists(appDataIconsDir)) diff --git a/T7ECommon/T7ECommon.csproj b/T7ECommon/T7ECommon.csproj index f1aeefb..d19b4e0 100644 --- a/T7ECommon/T7ECommon.csproj +++ b/T7ECommon/T7ECommon.csproj @@ -78,6 +78,9 @@ MenuButton.cs + + + diff --git a/T7EPreferences/App.config b/T7EPreferences/App.config new file mode 100644 index 0000000..3deeecd --- /dev/null +++ b/T7EPreferences/App.config @@ -0,0 +1,7 @@ + + + + + + + diff --git a/T7EPreferences/Donate.cs b/T7EPreferences/Donate.cs index c7a6abc..0f914b7 100644 --- a/T7EPreferences/Donate.cs +++ b/T7EPreferences/Donate.cs @@ -26,11 +26,12 @@ public Donate(bool deliberate) // donatedialogdisable handled in show event - bool donateBalloonDisable = false; - bool.TryParse(Common.ReadPref("DonateBalloonDisable"), out donateBalloonDisable); + // dummying out donate dialog + bool donateBalloonDisable = true;// false; + //bool.TryParse(Common.ReadPref("DonateBalloonDisable"), out donateBalloonDisable); - bool donateBalloonShown = false; - bool.TryParse(Common.ReadPref("DonateBalloonShown"), out donateBalloonShown); + bool donateBalloonShown = true;// false; + //bool.TryParse(Common.ReadPref("DonateBalloonShown"), out donateBalloonShown); checkBox2.Enabled = checkBox2.Visible = donateBalloonShown; checkBox2.Checked = donateBalloonDisable; diff --git a/T7EPreferences/ExportForm.Designer.cs b/T7EPreferences/ExportForm.Designer.cs index 9effd00..80db4b7 100644 --- a/T7EPreferences/ExportForm.Designer.cs +++ b/T7EPreferences/ExportForm.Designer.cs @@ -46,46 +46,48 @@ private void InitializeComponent() // // ImportPanel // - this.ImportPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.ImportPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.ImportPanel.BackColor = System.Drawing.SystemColors.Window; - this.ImportPanel.Controls.Add(this.ShareWebIcon); - this.ImportPanel.Controls.Add(this.ShareWebLabel); - this.ImportPanel.Controls.Add(this.ShareWebCheckBox); this.ImportPanel.Controls.Add(this.ExportUniversalLabel); this.ImportPanel.Controls.Add(this.ExportProgramSpecificLabel); this.ImportPanel.Controls.Add(this.ExportUniversalCheckBox); this.ImportPanel.Controls.Add(this.ExportProgramSpecificCheckBox); this.ImportPanel.Controls.Add(this.ExportLabel); + this.ImportPanel.Controls.Add(this.ShareWebIcon); + this.ImportPanel.Controls.Add(this.ShareWebLabel); + this.ImportPanel.Controls.Add(this.ShareWebCheckBox); this.ImportPanel.Location = new System.Drawing.Point(0, 0); this.ImportPanel.Margin = new System.Windows.Forms.Padding(2); this.ImportPanel.Name = "ImportPanel"; - this.ImportPanel.Size = new System.Drawing.Size(419, 245); + this.ImportPanel.Size = new System.Drawing.Size(335, 125); this.ImportPanel.TabIndex = 0; // // ShareWebIcon // this.ShareWebIcon.Enabled = false; this.ShareWebIcon.Image = ((System.Drawing.Image)(resources.GetObject("ShareWebIcon.Image"))); - this.ShareWebIcon.Location = new System.Drawing.Point(12, 188); + this.ShareWebIcon.Location = new System.Drawing.Point(10, 150); this.ShareWebIcon.Margin = new System.Windows.Forms.Padding(2); this.ShareWebIcon.Name = "ShareWebIcon"; - this.ShareWebIcon.Size = new System.Drawing.Size(20, 20); + this.ShareWebIcon.Size = new System.Drawing.Size(16, 16); this.ShareWebIcon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.ShareWebIcon.TabIndex = 9; this.ShareWebIcon.TabStop = false; + this.ShareWebIcon.Visible = false; this.ShareWebIcon.Click += new System.EventHandler(this.ShareWebLabel_Click); // // ShareWebLabel // this.ShareWebLabel.Enabled = false; - this.ShareWebLabel.Location = new System.Drawing.Point(36, 180); + this.ShareWebLabel.Location = new System.Drawing.Point(29, 144); this.ShareWebLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.ShareWebLabel.Name = "ShareWebLabel"; - this.ShareWebLabel.Size = new System.Drawing.Size(362, 34); + this.ShareWebLabel.Size = new System.Drawing.Size(290, 27); this.ShareWebLabel.TabIndex = 8; this.ShareWebLabel.Text = "Your pack will be made available for visitors to download and enjoy!"; + this.ShareWebLabel.Visible = false; this.ShareWebLabel.Click += new System.EventHandler(this.ShareWebLabel_Click); // // ShareWebCheckBox @@ -93,32 +95,33 @@ private void InitializeComponent() this.ShareWebCheckBox.AutoSize = true; this.ShareWebCheckBox.Enabled = false; this.ShareWebCheckBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.ShareWebCheckBox.Location = new System.Drawing.Point(15, 156); + this.ShareWebCheckBox.Location = new System.Drawing.Point(12, 125); this.ShareWebCheckBox.Margin = new System.Windows.Forms.Padding(2); this.ShareWebCheckBox.Name = "ShareWebCheckBox"; - this.ShareWebCheckBox.Size = new System.Drawing.Size(312, 21); + this.ShareWebCheckBox.Size = new System.Drawing.Size(248, 17); this.ShareWebCheckBox.TabIndex = 7; this.ShareWebCheckBox.Text = "Share your pack on the official website"; this.ShareWebCheckBox.UseVisualStyleBackColor = true; + this.ShareWebCheckBox.Visible = false; this.ShareWebCheckBox.CheckedChanged += new System.EventHandler(this.ShareWebCheckBox_CheckedChanged); // // ExportUniversalLabel // this.ExportUniversalLabel.AutoSize = true; - this.ExportUniversalLabel.Location = new System.Drawing.Point(36, 119); + this.ExportUniversalLabel.Location = new System.Drawing.Point(29, 95); this.ExportUniversalLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.ExportUniversalLabel.Name = "ExportUniversalLabel"; - this.ExportUniversalLabel.Size = new System.Drawing.Size(295, 17); + this.ExportUniversalLabel.Size = new System.Drawing.Size(223, 13); this.ExportUniversalLabel.TabIndex = 6; this.ExportUniversalLabel.Text = "The pack will be compatible with all programs."; this.ExportUniversalLabel.Click += new System.EventHandler(this.ImportOpenLabel_Click); // // ExportProgramSpecificLabel // - this.ExportProgramSpecificLabel.Location = new System.Drawing.Point(36, 59); + this.ExportProgramSpecificLabel.Location = new System.Drawing.Point(29, 47); this.ExportProgramSpecificLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.ExportProgramSpecificLabel.Name = "ExportProgramSpecificLabel"; - this.ExportProgramSpecificLabel.Size = new System.Drawing.Size(362, 34); + this.ExportProgramSpecificLabel.Size = new System.Drawing.Size(290, 27); this.ExportProgramSpecificLabel.TabIndex = 3; this.ExportProgramSpecificLabel.Text = "The pack will be compatible with {0} only."; this.ExportProgramSpecificLabel.Click += new System.EventHandler(this.ImportNewLabel_Click); @@ -127,10 +130,10 @@ private void InitializeComponent() // this.ExportUniversalCheckBox.AutoSize = true; this.ExportUniversalCheckBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.ExportUniversalCheckBox.Location = new System.Drawing.Point(15, 96); + this.ExportUniversalCheckBox.Location = new System.Drawing.Point(12, 77); this.ExportUniversalCheckBox.Margin = new System.Windows.Forms.Padding(2); this.ExportUniversalCheckBox.Name = "ExportUniversalCheckBox"; - this.ExportUniversalCheckBox.Size = new System.Drawing.Size(221, 21); + this.ExportUniversalCheckBox.Size = new System.Drawing.Size(176, 17); this.ExportUniversalCheckBox.TabIndex = 2; this.ExportUniversalCheckBox.TabStop = true; this.ExportUniversalCheckBox.Text = "Export as a universal pack"; @@ -140,10 +143,10 @@ private void InitializeComponent() // this.ExportProgramSpecificCheckBox.AutoSize = true; this.ExportProgramSpecificCheckBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.ExportProgramSpecificCheckBox.Location = new System.Drawing.Point(15, 36); + this.ExportProgramSpecificCheckBox.Location = new System.Drawing.Point(12, 29); this.ExportProgramSpecificCheckBox.Margin = new System.Windows.Forms.Padding(2); this.ExportProgramSpecificCheckBox.Name = "ExportProgramSpecificCheckBox"; - this.ExportProgramSpecificCheckBox.Size = new System.Drawing.Size(276, 21); + this.ExportProgramSpecificCheckBox.Size = new System.Drawing.Size(218, 17); this.ExportProgramSpecificCheckBox.TabIndex = 1; this.ExportProgramSpecificCheckBox.TabStop = true; this.ExportProgramSpecificCheckBox.Text = "Export as a program-specific pack"; @@ -154,10 +157,10 @@ private void InitializeComponent() // this.ExportLabel.AutoSize = true; this.ExportLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.ExportLabel.Location = new System.Drawing.Point(11, 9); + this.ExportLabel.Location = new System.Drawing.Point(9, 7); this.ExportLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.ExportLabel.Name = "ExportLabel"; - this.ExportLabel.Size = new System.Drawing.Size(319, 20); + this.ExportLabel.Size = new System.Drawing.Size(275, 17); this.ExportLabel.TabIndex = 0; this.ExportLabel.Text = "How do you want to export the pack?"; // @@ -165,10 +168,10 @@ private void InitializeComponent() // this.OkButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.OkButton.DialogResult = System.Windows.Forms.DialogResult.OK; - this.OkButton.Location = new System.Drawing.Point(205, 261); + this.OkButton.Location = new System.Drawing.Point(164, 138); this.OkButton.Margin = new System.Windows.Forms.Padding(2); this.OkButton.Name = "OkButton"; - this.OkButton.Size = new System.Drawing.Size(94, 29); + this.OkButton.Size = new System.Drawing.Size(75, 23); this.OkButton.TabIndex = 1; this.OkButton.Text = "OK"; this.OkButton.UseVisualStyleBackColor = true; @@ -177,19 +180,19 @@ private void InitializeComponent() // this.CancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.CancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.CancelButton.Location = new System.Drawing.Point(304, 261); + this.CancelButton.Location = new System.Drawing.Point(243, 138); this.CancelButton.Margin = new System.Windows.Forms.Padding(2); this.CancelButton.Name = "CancelButton"; - this.CancelButton.Size = new System.Drawing.Size(94, 29); + this.CancelButton.Size = new System.Drawing.Size(75, 23); this.CancelButton.TabIndex = 2; this.CancelButton.Text = "Cancel"; this.CancelButton.UseVisualStyleBackColor = true; // // ExportForm // - this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; - this.ClientSize = new System.Drawing.Size(411, 304); + this.ClientSize = new System.Drawing.Size(329, 172); this.Controls.Add(this.CancelButton); this.Controls.Add(this.OkButton); this.Controls.Add(this.ImportPanel); diff --git a/T7EPreferences/ExportForm.resx b/T7EPreferences/ExportForm.resx index 1385d53..af325f4 100644 --- a/T7EPreferences/ExportForm.resx +++ b/T7EPreferences/ExportForm.resx @@ -121,16 +121,16 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m - dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIkSURBVDhPpZPPS5NxHMeff8GDF08eOtguQjI2xSYT - NHC/HOQG+qQ7+AzcKDvIVEJZD2QjIRYhTEabhVFjEWmZ5BLKfkA/WK08hh0UliB56RBe3n0+n7bv3NnD - i8/P9/v7fJ890wBoJ0HEA4WB41ioNom9dPoAFJm9So9nape1YuBf91ejkfidANVIrZZQKABLG9+lHvsy - xkb7lPOO0ojQvepmREwRC4//i6tkX3zD0OshTO1MIbgZ5B2DNeoJeh/1WqKl6B+KuJb9hFzuqM6AjXjG - B8R+xOBace2zRhk4lh0mgclbbzA/f4BU6hD5/F9lksx9gG/NJwbmLxP6lg7WKANPeLFou2MDE7iRQDy+ - g2SyjEzmUOA+i6d/TguRrxHuFZWBz7eGi9c30LrQKidx9F6dRSy2LXA9vj1eB/eUQV/fE8zM7KLlZovc - kU/jO3Pt96/jXOi25Nwb/TgqcK0MenryxWi0hOa5ZnnbVbimmcIWiciO56mHY+0KTucDMxjchHNiAvaM - XT6epngTzrhn0dGxJDgcy+jvf47zl+6KCc1rL7Gz856lq+t+ORR6j8YrjbCmrTh9QUdb26LAYr7m8PBb - VHbKtFf7GdvbsxphdHc/xKnLZ9Ew2YBA4CW83mcC5yMj76DrW+AdmhtE7UOyWtNaOPxZo2jY7Zmyy7WC - wcFXoJ7AOfd4xjssrjOgx9SOYaHcJIrVK1Ry7vFMxHUGJ/k7/wMvQV6oCcAxywAAAABJRU5ErkJggg== + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIcSURBVDhPpZLPS9NhHMf9Fzx48eShg+0iJGNTbDJB + A/fLQW6gS3dwAzfKDjKVUNYXqpEQixAmo83CqLGItExyCWU/oB+sVh7DDgpLkLx0iC7vnven7Zm71uH1 + fJ7Pj/f7+T7f77cBwH8hy2Bh8CgmhaHYS6cPoCLZq9TY07PawLvurcZQ4kcCKiK1WkKhACxtfJF8/OM4 + jfYrM1oji3PVSUSsIhYe/BVXyT79jOEXw5jemYZ/08+ZEDXaoO9+nylaiv5UEZey75HL/a4zIOzxgNjX + GBwrjn1qtIFt2WYoMHX9JebnD5BKHSKf/6XFydxbeNY8YmB8NxDYCoAabeAKLxYtNy0gvqsJxOM7SCbL + yGQOBdYpnvk2I0Q+RVgragOPZw1nr2ygbaFNTmJ0X5xDLLYtMJ/YnqiDNW3Q3/8Qs7O7aL3WKnfkabwz + c693HaeCN2TP2ti7MYG5NujtzRej0RJaLrfI267CXPU0lkhEaq5HLsbaFez2u4bfvwn75CSsGav8PM3x + ZpxwzqGzc0mw2ZYxMPAEp8/dEhPVr73Erq7bpu7uO+Vg8A2aLjTBnDbj+JkA2tsXBYp5zZGRV6jMlBW1 + z9jRkSWhnp57OHb+JBqnGuHzPYPb/VjgfnT0NQKBLXBG9UMK0cpiNqcbwuEPjCGrNVN2OFYwNPQcqiZw + zxp7nKG4zkA95lFMCkNRVFSvwT1r7Im4zuDfQcMfL0FeqN5X8ZkAAAAASUVORK5CYII= \ No newline at end of file diff --git a/T7EPreferences/ManageForm.cs b/T7EPreferences/ManageForm.cs index c43d606..1e3a275 100644 --- a/T7EPreferences/ManageForm.cs +++ b/T7EPreferences/ManageForm.cs @@ -167,9 +167,38 @@ private void EnableSelectedApp() string appPath = ManageListView.SelectedItems[0].SubItems[1].Text; string appId = ManageListView.SelectedItems[0].SubItems[2].Text; + if (Environment.OSVersion.Version.Major >= 10) + { + string existingLnkPath = PrimaryParent.GetLnkPathForTargetName(Path.GetFileNameWithoutExtension(appPath).ToLower()); + if (File.Exists(existingLnkPath)) + { + DialogResult unpinResult = new PinPrompt(true, existingLnkPath, appName, appPath, appId).ShowDialog(); + if (unpinResult != DialogResult.OK) + { + return; + } + } + } + // Enable app Preferences.EnableApp(appId, appPath); + if (Environment.OSVersion.Version.Major >= 10) + { + DialogResult unpinResult = new PinPrompt(false, "", appName, appPath, appId, (Environment.OSVersion.Version.Build < 10586)).ShowDialog(); + if (unpinResult != DialogResult.OK) + { + //Preferences.EraseJumplist(appId); + //Preferences.DisableApp(appId, appPath, appName); + + return; + } else + { + this.TopMost = true; + this.TopMost = false; + } + } + // Refresh applist PopulateManageListBox(); UpdateButtonStatus(); @@ -191,8 +220,18 @@ private void DeleteSelectedApp() if (deleteDialogResult != System.Windows.Forms.DialogResult.Yes) return; + string currentLnkPath = PrimaryParent.GetLnkPathForTargetName(Path.GetFileNameWithoutExtension(appPath).ToLower()); + if (File.Exists(currentLnkPath) && Common.TaskbarManagerInstance.GetApplicationIdForShortcut(currentLnkPath) == appId) + { + DialogResult unpinResult = new PinPrompt(true, currentLnkPath, appName, appPath, appId).ShowDialog(); + if (unpinResult != DialogResult.OK) + { + return; + } + } + if (PrimaryParent.CurrentAppId != null && PrimaryParent.CurrentAppId.Equals(appId)) - if (!PrimaryParent.ClearAppLoaded(true, false)) return; + if (!PrimaryParent.ClearAppLoaded(true, false)) return; // Delete app from internal, applist.xml, and appdata if (ManageListView.SelectedItems[0].Group == ManageListView.Groups[1]) @@ -215,6 +254,16 @@ private void DisableSelectedApp() string appPath = ManageListView.SelectedItems[0].SubItems[1].Text; string appId = ManageListView.SelectedItems[0].SubItems[2].Text; + string currentLnkPath = PrimaryParent.GetLnkPathForTargetName(Path.GetFileNameWithoutExtension(appPath).ToLower()); + if (File.Exists(currentLnkPath) && Common.TaskbarManagerInstance.GetApplicationIdForShortcut(currentLnkPath) == appId) + { + DialogResult unpinResult = new PinPrompt(true, currentLnkPath, appName, appPath, appId).ShowDialog(); + if (unpinResult != DialogResult.OK) + { + return; + } + } + if (PrimaryParent.CurrentAppId != null && PrimaryParent.CurrentAppId.Equals(appId)) { if (!PrimaryParent.ClearAppLoaded(true)) return; // Asks "do you want save?" @@ -291,6 +340,8 @@ void UpdateButtonStatus() ManageImportButton.Enabled = ManageDisableButton.Visible = true; + + ExitButton.Text = "&Close"; } else { @@ -302,6 +353,8 @@ void UpdateButtonStatus() FileOpenButton.Enabled = true; + ExitButton.Text = "&Cancel"; + ManageEnableButton.Visible = ManageEnableButton.Enabled = false; @@ -311,6 +364,8 @@ void UpdateButtonStatus() ManageImportButton.Enabled = FileOpenButton.Enabled = false; + + ExitButton.Text = "&Close"; } if (ManageListView.SelectedItems[0].Group == ManageListView.Groups[1]) diff --git a/T7EPreferences/PinPrompt.Designer.cs b/T7EPreferences/PinPrompt.Designer.cs new file mode 100644 index 0000000..fedd31e --- /dev/null +++ b/T7EPreferences/PinPrompt.Designer.cs @@ -0,0 +1,202 @@ +namespace T7EPreferences +{ + partial class PinPrompt + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PinPrompt)); + this.TitleLabel = new System.Windows.Forms.Label(); + this.PinPictureBox = new System.Windows.Forms.PictureBox(); + this.DescLabel = new System.Windows.Forms.Label(); + this.RunButton = new System.Windows.Forms.Button(); + this.RunButtonPanel = new System.Windows.Forms.Panel(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.CloseButton = new System.Windows.Forms.Button(); + this.UnpinPictureBox = new System.Windows.Forms.PictureBox(); + this.HidePromptCheckBox = new System.Windows.Forms.CheckBox(); + ((System.ComponentModel.ISupportInitialize)(this.PinPictureBox)).BeginInit(); + this.RunButtonPanel.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.UnpinPictureBox)).BeginInit(); + this.SuspendLayout(); + // + // TitleLabel + // + this.TitleLabel.Dock = System.Windows.Forms.DockStyle.Top; + this.TitleLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.TitleLabel.Location = new System.Drawing.Point(0, 0); + this.TitleLabel.Margin = new System.Windows.Forms.Padding(0); + this.TitleLabel.Name = "TitleLabel"; + this.TitleLabel.Padding = new System.Windows.Forms.Padding(10, 10, 10, 0); + this.TitleLabel.Size = new System.Drawing.Size(344, 56); + this.TitleLabel.TabIndex = 1; + this.TitleLabel.Text = "Run the app and pin to taskbar to finish saving the jump list."; + // + // PinPictureBox + // + this.PinPictureBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.PinPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("PinPictureBox.Image"))); + this.PinPictureBox.Location = new System.Drawing.Point(0, 128); + this.PinPictureBox.Name = "PinPictureBox"; + this.PinPictureBox.Size = new System.Drawing.Size(344, 164); + this.PinPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.PinPictureBox.TabIndex = 2; + this.PinPictureBox.TabStop = false; + // + // DescLabel + // + this.DescLabel.Dock = System.Windows.Forms.DockStyle.Top; + this.DescLabel.Location = new System.Drawing.Point(0, 56); + this.DescLabel.Name = "DescLabel"; + this.DescLabel.Padding = new System.Windows.Forms.Padding(10, 0, 10, 0); + this.DescLabel.Size = new System.Drawing.Size(344, 39); + this.DescLabel.TabIndex = 3; + this.DescLabel.Text = "The app needs to be run first and then pinned to taskbar before the jump list com" + + "mands will work."; + // + // RunButton + // + this.RunButton.AutoSize = true; + this.RunButton.BackColor = System.Drawing.SystemColors.Control; + this.RunButton.Dock = System.Windows.Forms.DockStyle.Fill; + this.RunButton.Location = new System.Drawing.Point(60, 0); + this.RunButton.Margin = new System.Windows.Forms.Padding(2); + this.RunButton.Name = "RunButton"; + this.RunButton.Size = new System.Drawing.Size(224, 23); + this.RunButton.TabIndex = 4; + this.RunButton.Text = "Run {0}"; + this.RunButton.UseVisualStyleBackColor = true; + this.RunButton.Click += new System.EventHandler(this.RunButton_Click); + // + // RunButtonPanel + // + this.RunButtonPanel.AutoSize = true; + this.RunButtonPanel.Controls.Add(this.RunButton); + this.RunButtonPanel.Dock = System.Windows.Forms.DockStyle.Top; + this.RunButtonPanel.Location = new System.Drawing.Point(0, 95); + this.RunButtonPanel.Name = "RunButtonPanel"; + this.RunButtonPanel.Padding = new System.Windows.Forms.Padding(60, 0, 60, 10); + this.RunButtonPanel.Size = new System.Drawing.Size(344, 33); + this.RunButtonPanel.TabIndex = 5; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.BackColor = System.Drawing.SystemColors.Control; + this.tableLayoutPanel1.ColumnCount = 2; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 66.56977F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33.43023F)); + this.tableLayoutPanel1.Controls.Add(this.CloseButton, 1, 0); + this.tableLayoutPanel1.Controls.Add(this.HidePromptCheckBox, 0, 0); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 292); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 1; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Size = new System.Drawing.Size(344, 49); + this.tableLayoutPanel1.TabIndex = 6; + // + // CloseButton + // + this.CloseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.CloseButton.Location = new System.Drawing.Point(256, 13); + this.CloseButton.Margin = new System.Windows.Forms.Padding(0, 0, 13, 13); + this.CloseButton.Name = "CloseButton"; + this.CloseButton.Size = new System.Drawing.Size(75, 23); + this.CloseButton.TabIndex = 0; + this.CloseButton.Text = "Cancel"; + this.CloseButton.UseVisualStyleBackColor = true; + this.CloseButton.Click += new System.EventHandler(this.CloseButton_Click); + // + // UnpinPictureBox + // + this.UnpinPictureBox.Dock = System.Windows.Forms.DockStyle.Fill; + this.UnpinPictureBox.Image = ((System.Drawing.Image)(resources.GetObject("UnpinPictureBox.Image"))); + this.UnpinPictureBox.Location = new System.Drawing.Point(0, 128); + this.UnpinPictureBox.Name = "UnpinPictureBox"; + this.UnpinPictureBox.Size = new System.Drawing.Size(344, 164); + this.UnpinPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.UnpinPictureBox.TabIndex = 7; + this.UnpinPictureBox.TabStop = false; + this.UnpinPictureBox.Visible = false; + // + // HidePromptCheckBox + // + this.HidePromptCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.HidePromptCheckBox.AutoSize = true; + this.HidePromptCheckBox.Enabled = false; + this.HidePromptCheckBox.Location = new System.Drawing.Point(13, 17); + this.HidePromptCheckBox.Margin = new System.Windows.Forms.Padding(13, 0, 0, 15); + this.HidePromptCheckBox.Name = "HidePromptCheckBox"; + this.HidePromptCheckBox.Size = new System.Drawing.Size(172, 17); + this.HidePromptCheckBox.TabIndex = 1; + this.HidePromptCheckBox.Text = "Don\'t show this message again"; + this.HidePromptCheckBox.UseVisualStyleBackColor = true; + this.HidePromptCheckBox.Visible = false; + // + // PinPrompt + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.Window; + this.ClientSize = new System.Drawing.Size(344, 341); + this.Controls.Add(this.PinPictureBox); + this.Controls.Add(this.UnpinPictureBox); + this.Controls.Add(this.tableLayoutPanel1); + this.Controls.Add(this.RunButtonPanel); + this.Controls.Add(this.DescLabel); + this.Controls.Add(this.TitleLabel); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "PinPrompt"; + this.ShowInTaskbar = false; + this.Text = "PinPrompt"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.PinPrompt_FormClosing); + ((System.ComponentModel.ISupportInitialize)(this.PinPictureBox)).EndInit(); + this.RunButtonPanel.ResumeLayout(false); + this.RunButtonPanel.PerformLayout(); + this.tableLayoutPanel1.ResumeLayout(false); + this.tableLayoutPanel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.UnpinPictureBox)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label TitleLabel; + private System.Windows.Forms.PictureBox PinPictureBox; + private System.Windows.Forms.Label DescLabel; + private System.Windows.Forms.Button RunButton; + private System.Windows.Forms.Panel RunButtonPanel; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Button CloseButton; + private System.Windows.Forms.PictureBox UnpinPictureBox; + private System.Windows.Forms.CheckBox HidePromptCheckBox; + } +} \ No newline at end of file diff --git a/T7EPreferences/PinPrompt.cs b/T7EPreferences/PinPrompt.cs new file mode 100644 index 0000000..e9e00cd --- /dev/null +++ b/T7EPreferences/PinPrompt.cs @@ -0,0 +1,239 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Windows.Forms; +using T7ECommon; + +namespace T7EPreferences +{ + public partial class PinPrompt : Form + { + FileSystemWatcher LnkWatcher; + + public PinPrompt(bool unpinPrompt, string lnkPath, string appName, string appPath, string appId) + { + PinPromptInitialize(unpinPrompt, lnkPath, appName, appPath, appId, false); + } + + public PinPrompt(bool unpinPrompt, string lnkPath, string appName, string appPath, string appId, bool pinRequired) + { + PinPromptInitialize(unpinPrompt, lnkPath, appName, appPath, appId, pinRequired); + } + + private void PinPromptInitialize(bool unpinPrompt, string lnkPath, string appName, string appPath, string appId, bool pinRequired) + { + InitializeComponent(); + this.Icon = Primary.PrimaryIcon; + + PromptUnpin = unpinPrompt; + CurrentAppId = appId; + CurrentAppPath = appPath; + CurrentAppName = appName; + WatchTargetName = Path.GetFileNameWithoutExtension(appPath).ToLower(); + + WatchLnkPath = lnkPath; + + SwitchPrompt(unpinPrompt, pinRequired); + + ReallyCenterToScreen(); + + LnkWatcher = new FileSystemWatcher(); + HookShortcut(); + } + + bool PromptUnpin = false; + string CurrentAppId = ""; + string CurrentAppName = ""; + string CurrentAppPath = ""; + string WatchLnkPath = ""; + string WatchTargetName = ""; + + + private void SwitchPrompt(bool unpinPrompt, bool pinRequired) + { + if (unpinPrompt) + { + this.Text = "Unpin the app"; + TitleLabel.Text = "Unpin the app from taskbar to continue."; + DescLabel.Text = "The app needs to be unpinned to prevent duplicate program icons from appearing on the taskbar."; + RunButton.Enabled = false; + RunButtonPanel.Visible = false; + UnpinPictureBox.Visible = true; + PinPictureBox.Visible = false; + TopMost = false; + CloseButton.Text = "Cancel"; + CloseButton.DialogResult = DialogResult.Cancel; + } + else + { + this.Text = "Pin the app"; + RunButton.Enabled = true; + RunButtonPanel.Visible = true; + RunButton.Text = String.Format("Run {0}", CurrentAppName); + UnpinPictureBox.Visible = false; + PinPictureBox.Visible = true; + TopMost = true; + if (pinRequired) + { + TitleLabel.Text = "Run the app and pin to taskbar to finish saving."; + DescLabel.Text = "The app needs to be run first, then pinned by right-clicking its icon, before the jump list commands will work correctly."; + CloseButton.Text = "Cancel"; + CloseButton.DialogResult = DialogResult.Cancel; // makes status text warn "you may need to pin the app" + } else + { + TitleLabel.Text = "Run the app and pin to taskbar (optional)"; + DescLabel.Text = "You should pin the app by right-clicking its icon only while it's running, or else duplicate icons may appear in the future."; + + bool hidePinPromptOptional = false; + if(Common.PrefExists("HidePinPromptOptional")) bool.TryParse(Common.ReadPref("HidePinPromptOptional"), out hidePinPromptOptional); + HidePromptCheckBox.Visible = true; + HidePromptCheckBox.Enabled = true; + HidePromptCheckBox.Checked = hidePinPromptOptional; + + CloseButton.Text = "Skip"; + CloseButton.DialogResult = DialogResult.OK; + } + + } + } + + + + protected void ReallyCenterToScreen() + { + Screen screen = Screen.FromControl(this); + + Rectangle workingArea = screen.WorkingArea; + this.Location = new Point() + { + X = Math.Max(workingArea.X, workingArea.X + (workingArea.Width - this.Width) / 2), + Y = Math.Max(workingArea.Y, workingArea.Y + (workingArea.Height - this.Height) / 2) + }; + } + + private void RunButton_Click(object sender, EventArgs e) + { + if (Path.GetFileName(CurrentAppPath).Equals("explorer.exe", StringComparison.OrdinalIgnoreCase)) + Process.Start(CurrentAppPath, "/e"); + else + { + try + { + Process[] currentProcesses = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(CurrentAppPath)); + if (currentProcesses.Length > 0) + Interop.SetForegroundWindow(currentProcesses[0].MainWindowHandle); + else + Process.Start(CurrentAppPath); + } + catch (Exception ex) + { + Process.Start(CurrentAppPath); + } + } + } + + /// + /// Hook AppData\Microsoft\Internet Explorer\Quick Launch\User Pinned to look for file creation. When a LNK is created, T7EBg assigns the appropriate AppId. + /// + private void HookShortcut() + { + string basePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft\\Internet Explorer\\Quick Launch\\User Pinned"); + + //CommonLog("Hooking " + basePath + " for DirectoryName and FileName changes"); + + LnkWatcher.Path = basePath; + LnkWatcher.IncludeSubdirectories = true; + LnkWatcher.Filter = "*.lnk"; + LnkWatcher.NotifyFilter = NotifyFilters.DirectoryName | NotifyFilters.FileName; + LnkWatcher.Created += new FileSystemEventHandler(lnkWatcher_Created); + LnkWatcher.Deleted += new FileSystemEventHandler(LnkWatcher_Deleted); + LnkWatcher.EnableRaisingEvents = true; + + //CommonLog("Registered shortcut hook on " + basePath); + } + + private void lnkWatcher_Created(object sender, FileSystemEventArgs e) + { + var loopI = 0; + LnkWatcher_Beginning: + + if ((new FileInfo(e.FullPath).Length) <= 0) + { + Thread.Sleep(20); + loopI++; + if (loopI <= 13) goto LnkWatcher_Beginning; // Try for 260ms + else return; + } + + //CommonLog("Detected new shortcut: " + e.FullPath, 1); + + // Assign appid to last created shortcut + if (!PromptUnpin) + { + if (Path.GetFileNameWithoutExtension(Common.ResolveLnkPath(e.FullPath)).ToLower() == WatchTargetName) + { + CloseFromThread(DialogResult.OK); + //Close(); + //DialogResult = DialogResult.OK; + } + } + + //CommonLog("Finished handling new shortcut.", 0); + } + + + private void LnkWatcher_Deleted(object sender, FileSystemEventArgs e) + { + if (PromptUnpin) { + if (Path.GetFullPath(e.FullPath).Equals(Path.GetFullPath(WatchLnkPath))) + { + CloseFromThread(DialogResult.OK); + //Close(); + //DialogResult = DialogResult.OK; + } + } + } + + private void CloseButton_Click(object sender, EventArgs e) + { + Close(); + if (CloseButton.Text == "Skip") + DialogResult = DialogResult.OK; + else + DialogResult = DialogResult.Cancel; + } + + private void PinPrompt_FormClosing(object sender, FormClosingEventArgs e) + { + LnkWatcher.EnableRaisingEvents = false; + LnkWatcher.Dispose(); + + if(HidePromptCheckBox.Enabled) + { + Common.WritePref("HidePinPromptOptional", HidePromptCheckBox.Checked.ToString()); + } + } + + private void CloseFromThread(DialogResult result) + { + if (this.InvokeRequired) + { + // It's on a different thread, so use Invoke. + this.BeginInvoke(new MethodInvoker(() => CloseFromThread(result))); + } + else + { + // It's on the same thread, no need for Invoke + Close(); + DialogResult = result; + } + } + } +} diff --git a/T7EPreferences/PinPrompt.resx b/T7EPreferences/PinPrompt.resx new file mode 100644 index 0000000..5c5613b --- /dev/null +++ b/T7EPreferences/PinPrompt.resx @@ -0,0 +1,934 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAABJcAAAK3CAIAAAC3FzmzAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAW + IwAAFiMByVFgawAAABh0RVh0U29mdHdhcmUAcGFpbnQubmV0IDQuMC42/Ixj3wAAWJBJREFUeF7t3Xuw + bGdZ4P8TCITLBBHiHwQnWFgDigMJSCDGhKBcEpIgQRwBcar0J1SNUjiUNTVyKUtKnPEfEKW4aZUzY40z + lFVeZpRR1KmREcQIqHNBUVAZLiaiQEICyCVyfs/p9+3lOk93r929e72n1+7+fOtT1H5Xr1t370P6qX0u + p059z38FAADgxMhrAAAApiyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIAp + y2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEA + AJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMry + GgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAA + piyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwG + AABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIAp + y2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEA + AJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMry + GgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAA + piyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwG + AABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIAp + y2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEA + AJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMry + GgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAA + piyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwG + AABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIAp + y2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEA + AJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMry + GgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAA + piyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwG + AABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIAp + y2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEA + AJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMry + GgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwGAABgyvIaAACAKctrAAAA + piyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIApy2sAAACmLK8BAACYsrwG + AABgyvIaAACAKctrAAAApiyvAQAAmLK8BgAAYMryGgAAgCnLawAAAKYsrwEAAJiyvAYAAGDK8hoAAIAp + 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 + +uu/PP/M72/8+Lmd4uJyt5/62AfP/9/vueC3fuu+od7WTqsDwby6tdemP/xZNZCsOagM71YeikYZYNa5 + pSP3WfN5lcqekSlOkg48UxyMI69pbCdT3M033zu8/4/v+YkP3f3MP8b9t7O/oDKNW43EheJynzz1yY/c + /S/ed893v/teod7WTouxoc4EK37AtdGAEa3af83zDO9WHorqervquWbXiusuLR6qO62YmmKf8mh8UTet + rjvbqilum5NIkk5QpjgYR17T2E6muPe9757ho395/h233K3tP/a9aPavxsVF77z1brd+6PwPfOCeod7W + TotJoIwEUd10dt2AsXSsWmzV/mueZ3i38lBU11vUXWj94pB6cK/uPEsfTa0awEY5iSTpBGWKg3HkNY2Z + 4kxxSxverTwU1fUWdbPQRtWDe3U3HF/UTasre0bbTHFlz8gUJ0knN1McjCOvacwUd1KmuG6HTae4NJB0 + 2ycyxdUTze7zyOquywan7tH4om5aXdkzqut5o5xEknSCMsXBOPKaxkxxJ2WKi+rD640N3c+40sDTDSpT + mOLWvJmusnO0OGV1p1p8KNXtGdVN80Y5iSTpBGWKg3HkNY3tZIrzt5ssts4U1w1mR84Y/bOtmuKiumlZ + dY/GU9z6z6g0cPPrj1XdRRef2ignkSSdoExxMI68prGdTHH+pYHF1pni+jNGms1Sw9NReSha+mjUv5ml + U0p9bOsprp5l7fOsOZ2uel7RwBmiUU4iSTpBmeJgHHlNYzuZ4vyr34v1B4O6aVndeBatmh+O3KfbYemE + 1r+TqN0U141MSy+xqlU33x/AoqVPvP/Ull50lJNIkk5QpjgYR17T2E6muNe+9qLwa79y4Qfee8HpT586 + fdvsz6qlcauRuFBc7tOnPvDee771LRe+7nUPDPW2dlp/NqibltXfLYopIgaP2FhaZwiJ0m5Lz7BqWCqV + h6K6Plb1FIM/9VosbrIedvYTXHrns+dU67aX6mFnN8pJJEknKFMcjCOvaWwnU9zLX/6g8Oaf+/L/+4f3 + Ov13Z34ydubPqqVxq5G40O2nTn/21Hv/8F5v/rn7/9APPSjU29ppMSHUyeCo2aC/50CxWz1gWWkaScWx + /XmmHtOrPBTV9eZ154/qprWrh509/nUnjC+OfIlWvTijnESSdIIyxcE48prGdjLFPf/5DwlvfP1F7775 + Pqe/cOr0nbM/q5bGrUbiQnecOv35U++5+T5vesNFL3jBJaHe1k7rzwx102DdvLFYmUDqfqtbdYZybPdo + oymuGyOXnn+4/p3XTWcPYLFcNYMNX26Uk0iSTlCmOBhHXtPYTqa4b//2h4dXv+ri3337hXd9/tTf33nq + S5+c/e2Rt546fcvC3DWKOG2c/K9PfekTZy531+dOvfPtF/74qy9+9rMfFupt7bqYHEp1vUYxZtRjZq0z + vKXqkbP6h3dnXnrO8lBU15tXjz/WPXf3FtVNCwNYqb/nOheK3bY/iSTpBGWKg3HkNY3tZIp72tMuDT/6 + o1/1tv9x/y9+/ry///R5f1/+aFwZ5NIANorZCBeXiAvF5eKib/vt+/+bH/2q66+/NNTb0kkuRqzFAWzT + RjmJJOkEZYqDceQ1je1kirvqqivCy1/+sN/4jQd+7nPnffEz5911++yvjmz3z3/PRri4RFwoLhcX/c3f + fODLXvZPrrrq8aHelk5ypjhJ0jEyxcE48prGdjLFXX31leGFL/y6n/7pB//e7933z/74gk989Pwzf1zt + k7NZ65ZRf19lOVucNk5+x6m40Pv/5IKbb77vT/3UxS984SPKndTb0knOFCdJOkamOBhHXtPYTqa4Jzzh + 6vC85132kpc89PWv/4q3/tr9/vxPLjjzl1XGIPfx+Z+OG2WQK+eJE5a/1OTvTv35+y74jV+73+tff9FL + X/rQ5z3v0muuuTrU29JJzhQnSTpGpjgYR17T2E6muNKNN17+nOc84sxfVvmGi979+/c5fdep05+Z/WNu + I/41J2WEixPGaePkd516z7vu86Y3nvmrKZ/znK99+tMvr7eik58pTpJ0jExxMI68prEdTnHXXnvFTTc9 + +tnP/tof+ZFLfukXHvBn77vglg/e445b73Zm4ur+jNzxxrlueJv9Wbg4YZz2lg+e//4/veCXf/EBr3zl + mRHuGc+47Lrrrqi3opOfKU6SdIxMcTCOvKaxHU5xT37yVTHI3XDDY1/0oof/xGsu/pX/euF7br53DHJn + fmj2qfmfkSuDXBrSjtSNcHGSONVnTsUI9we/f++3/OqFr/3Ji7//+x9+442PjREubqDeik5+pjhJ0jEy + xcE48prGdjjFXTPvuc999A/8wENf9aqLYpD7s/ddcOa3VpY/I3fsv7Wy+ync7M/CxQnf/6cXxAj3mtdc + 9K/+1UOf+9zL6oWvuabeik5+pjhJ0jEyxcE48prGpjDF3XTT5d/93f80BrmfeM3Fv/SLD3jPu+7z5+87 + 87dW3nX7mX/e7UsxjH381Om/nQ1mH5uJIS0p22OH2O3js3/a+7Yz/6hAnCROFSf85V98wE/+5MUxwn3P + 9/zTuFy9sCluj+r+be5t/mHuUU4iSTpBmeJgHHlNYzuc4qIySl177ZXPfObjnvvcR3//ix7+ylde8qY3 + XvQbv36/9//xBV/8zOwfBL9z9iO122d/Q0l/ouvMJrfy59/O7HbHqTjkzD/t/Znz4iRxqjjhj77yku// + /oc/97mXxQh33XVXluvWm5AkSYeaKQ7Gkdc0ttsprlRmqujGGx/7nOd87QtecMnrX3/RzTff98w/CP75 + 8+763KnTnz91+rOnTn969ofcYk775Gxm68QyNsZDsUPs9vlTcUgcGIfHSeJU5W+kjJPXy5jfJEnSLFMc + jCOvaWxSU9x1113xjGdcFhPXS1/60J/6qYt/8zcf+Lbfvv87337he26+z3v/8F4f+L/3/Oj77/Gxvzz/ + kx+5+5233q0Ty9gYD8UOsVvsHIfEgXF4nCRO1f2NlPUypjhJkjTLFAfjyGsam8IUF5Xh6slPvipmrac/ + /fLnPe/SF77wES972T/50Vc+5MdfffGb3nDRm//T/d/6lgt/7+33/t9/cMFfvO+et37o/E4sY2M8FDvE + brFzHBIHxuFxkjhVnLD8jZTlKvWSkiTp4DPFwTjymsYmMsWlrrnm6quvvvKqqx5//fWXPvvZD3vBCy75 + oR960Ote98Bf+IX7/dZv3ffd777XBz5wz04sY2M8FDvEbrFzHBIHxuFxkjhVPakkSdLZmeJgHHlNY6Y4 + SZJ0sJniYBx5TWPTnOIkSZLOQaY4GEde05gpTpIkHWymOBhHXtOYKU6SJB1spjgYR17TmClOkiQdbKY4 + GEde05gpTpIkHWymOBhHXtOYKU6SJB1spjgYR17TmClOkiQdbKY4GEde05gpTpIkHWymOBhHXtOYKU6S + JB1spjgYR17TmClOkiQdbKY4GEde05gpTpIkHWymOBhHXtOYKU6SJB1spjgYR17TmClOkiQdbKY4GEde + 05gpTpIkHWymOBhHXtOYKU6SJB1spjgYR17TmClOkiQdbKY4GEde05gpTpIkHWymOBhHXtOYKU6SJB1s + pjgYR17TmClOkiQdbKY4GEde05gpTpIkHWymOBhHXtOYKU6SJB1spjgYR17TmClOkiQdbKY4GEde05gp + TpIkHWymOBhHXtOYKU6SJB1spjgYR17TWDfFPUuSJOnAMsXBOPKaxkxxkiTpYDPFwTjymsZMcZIk6WAz + xcE48prGTHGSJOlgM8XBOPKaxkxxkiTpYDPFwTjymsZMcZIk6WAzxcE48prGTHGSJOlgM8XBOPKaxkxx + kiTpYDPFwTjymsZMcZIk6WAzxcE48prGTHGSJOlgM8XBOPKaxkxxkiTpYDPFwTjymsZMcZIk6WAzxcE4 + 8prGTHGSJOlgM8XBOPKaxkxxkiTpYDPFwTjymsZMcZIk6WAzxcE48prGTHGSJOlgM8XBOPKaxkxxkiTp + YDPFwTjymsZMcZIk6WAzxcE48prGTHGSJOlgM8XBOPKaxkxxkiTpYDPFwTjymsZMcZIk6WAzxcE48prG + THGSJOlgM8XBOPKaxkxxkiTpYDPFwTjymsZMcZIk6WAzxcE48prGTHGSJOlgM8XBOPKaxkxxkiTpYDPF + wTjymsZMcZIk6WAzxcE48prGTHEnt5/5mZ9517veFf9b15Os3OSW91nOUBeSmnXsX7Cj/EqXdpIpDsaR + 1zRmittV3YeepR35SSh2OD1vyh+b4rmUm4wv6qYNu+WWW8oZ4ou6SVKbjv0Ldvtf6dKuMsXBOPKaxkxx + u6r70DNQzC2rJrT+4VP+2LT9Z7tyeKluktSmY/+C3f5XurSrTHEwjrymMVPcruo+9BzZ0p9BTednccNX + 3/6znZ/FqUWT+gn2dG7m2L9gt/+VLu0qUxyMI69pzBS3q7oPPVF8nepGl9KqQS723OHnv7h6ub26Xla3 + T3xRN21eHLvN4VK/+F4q35N1vbviF2/5lT6db+/uxdn0lo59oLTzTHEwjrymMVPcruo+9Kz6EVP3Ca80 + wc9G9c7aT3HSiJVvyKiud9cEf3Uc+5Ym+FykNTPFwTjymsZO0BRXPiKU4oPCdH4P0vHqPvSsmuJK3SA3 + vNtOKjcW1fWyfLbT1CrfkFFd764J/uo49i1N8LlIa2aKg3HkNY2d0CmuFIPNyZ3lug89w+NZt1tUN02m + elumOJ2oyjdkVNe7a4K/Oo59SxN8LtKameJgHHlNYyd6iiud0EGu+9Bz5A/Zym7R1J5pvS1TnE5U5Rsy + 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 + 5ZUxv3Uj3Ld8y7fcdNNN973vff/4j/+4jnGnT7/gBS/46q/+6quvvjr2uf7662OHehbtS6Y4GEde05gp + TpJ0UMUUFyPcN33TNz35yU+O/+1GuPJztssuu+yFL3xhneFOn/6jP/qj2Pmqq6564hOfeO2118ZuflPl + nmWKg3HkNY2Z4iRJB9XFF198/fXXP/3pT7/uuutiMIuvuxEuiq/PP//8/r8dF/s84hGPeMLs3xu4YfYP + fJc9tR+Z4mAceU1j3RT3REmSDqNrrrnm6quv/sZZ5R/1rg/MevCDH/ya17ymznCnT//BH/zB/e53v0c9 + 6lGPecxjrrjiisX9daIzxcE48prGTHGSpEMrxrCo/KG4xZHscY973MMe9rAywt15553/9t/+2/POO+8R + j3jEox/96HjIFLdnmeJgHHlNY6Y4SdJhNjCMPeABD/jVX/3Vl73sZXe/+90vuuiir/mar7n00ksf85jH + PP7xjzfF7VmmOBhHXtOYKU6SpNQjH/nIe9zjHpdccklMbqWv//qvf9zjHnfllVdeffXVprh9yhQH48hr + GjPFSZKUijktprUoxrbHz/qGb/iGb/zGbzTC7V+mOBhHXtOYKU6SpKWVWe6qWWV+M8LtX6Y4GEde05gp + TpKkVZXJrVQ3ab8yxcE48prGTHGSJOlgM8XBOPKaxkxxkiTpYDPFwTjymsZMcZIk6WAzxcE48prGTHGS + JOlgM8XBOPKaxkxxkiTpYDPFwTjymsZMcZIk6WAzxcE48prGTHGSJOlgM8XBOPKaxkxxkiTpYDPFwTjy + msZMcZIk6WAzxcE48prGTHGSJOlgM8XBOPKaxkxxkiTpYDPFwTjymsZMcZIk6WAzxcE48prGTHGSJOlg + M8XBOPKaxkxxkiTpYDPFwTjymsZMcZIk6WAzxcE48prGTHGSJOlgM8XBOPKaxkxxkiTpYDPFwTjymsZM + cZIk6WAzxcE48prGTHGSJOlgM8XBOPKaxkxxkiTpYDPFwTjymsZMcSe9351X1zpWU3gNX/va15bbiC/q + JklS40xxMI68pjFT3ASLD/HdB/rSwMf60/PqWpv3kY98pLyG8UXdtIvijS63EV/UTZKkxpniYBx5TWOm + uOlUJrfyOX5pS2eM+pgpbovqKzirbtpFpjhJOveZ4mAceU1jE5niYoCJD68DP3HavhiBdvuTloHiice9 + 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 + kJMkSUdmioNx5DWNTW2KG3H6MshJkqThTHEwjrymsUlNcaPPXQY5SZI0kCkOxpHXNDadKa7RxGWQkyRJ + qzLFwTjymsYmMsU1nbUMcpIkaWmmOBhHXtPYFKa4mKzqjNVsyuoGufiibpIkSQefKQ7Gkdc0NoUpLiqD + XNMflMX8ZoSTJEn9THEwjrymsYlMcZIkSec+UxyMI69pzBQnSZIONlMcjCOvacwUJ0mSDjZTHIwjr2nM + FCdJkg42UxyMI69pzBQnSZIONlMcjCOvacwUJ0mSDjZTHIwjr2nMFCdJkg42UxyMI69pzBQnSZIONlMc + jCOvacwUJ0mSDjZTHIwjr2nMFCdJkg42UxyMI69pzBQnSZIONlMcjCOvacwUJ0mSDjZTHIwjr2nMFCdJ + kg42UxyMI69pzBQnSZIONlMcjCOvacwUJ0mSDjZTHIwjr2nMFCdJkg42UxyMI69pzBQnSZIONlMcjCOv + acwUJ0mSDjZTHIwjr2nMFCdJkg42UxyMI69pzBQnSZIONlMcjCOvacwUJ0mSDjZTHIwjr2nMFCdJkg42 + UxyMI69pzBQnSZIONlMcjCOvacwUJ0mSDjZTHIwjr2nMFCdJkg42UxyMI69pzBQnSZIONlMcjCOvacwU + J0mSDjZTHIwjr2nMFCdJkg42UxyMI69pzBQnSZIONlMcjCOvacwUJ0mSDjZTHIwjr2nMFCdJkg42UxyM + I69pzBQnSZIONlMcjCOvacwUJ0mSDjZTHIwjr2nMFCdJkg42UxyMI69pzBQnSZIONlMcjCOvacwUJ0mS + DjZTHIwjr2nMFCdJkg42UxyMI69pzBQnSZIONlMcjCOvacwUJ0mSDjZTHIwjr2nMFCdJkg42UxyMI69p + zBQnSZIONlMcjCOvacwUJ0mSDjZTHIwjr2nMFCdJkg42UxyMI69pzBQnSZIONlMcjCOvacwUJ0mSDjZT + HIwjr2nMFCdJkg42UxyMI69pzBQnSZIONlMcjCOvacwUJ0mSDjZTHIwjr2nMFCdJkg42UxyMI69pzBQn + SZIONlMcjCOvacwUJ0mSDjZTHIwjr2nMFCdJkg42UxyMI69pzBQnSZIONlMcjCOvacwUJ0mSDjZTHIzj + 1JddDMBS137rd3CCpLcPAPZWXgMwl4YEJi69fQCwt/IagLk0JDBx6e0DgL2V1wDMpSGBiUtvHwDsrbwG + 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 + YII= + + + + + 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 + 8pc/+iMf2X/gn/a+Zd/dN++77+/CpTasEzHt6O/I3X3zxvdu3/ed7+z76Ee//xWveNTJJz81lGUd9ERL + MKtF2fYbcdFLVAMmE8e2dBotJ22mfVi1K1KV9eAq1cZdpBy/dYayabtvx9VrqO9YWlWdeW7OIpOIiMge + ii4OupFreraULu7MM48Lr33tI/7w/33Qd+7Y973o4hb5jZTzGP+yk3u+tXHPbfu+d9e+P/rYg37ldY84 + 66zjQlnWMlJ6gq3dWrNDK5saib11j9eSWU1a3ZZ01cVNLqYas9PMOmO9vXmLJpOGTa6qmVnX3skkIiKy + h6KLg27kmp4tpYu76KJjwxvfcMwn/r+j775r3923jv5p76qF6/BnKZti2lEjFye659aNu7+z8ScfP/rf + vvGYiy9+dCjLWkbqtqHZEqReoplmgxeJAbGlTpTNxmNqmzH1jJNpH1btisRJqw9ifJX4uAzaYeqVxyRl + 0yj1KSJl07RUp47EB9VU8b/x8ejGHEg9oEo6S5VOJhERkT0UXRx0I9f0bCld3Atf+PADv5ryLfs/c9WR + m9/d2Lx1Y/OGib6rJ3GiWzY279r47FVHvv2tB35ZZSjLWlJKQzD+Ib3431JPa1rqVidSjZ9M+5i6D4lh + ZdO0tA+rdkWqYbNWsqNUE0ZK3UjZ0Xqi1F/Nuro5b06V3U0iIiJ7KLo46Eau6dlSurhXvvIh4d3v+nt/ + 8ecPOPCrKb+9sfnNiXarJ3Gimw/8qwNX//kD3v2uB/3yLz8klGUtKXVLUPUMdSMRH1QD6kTDUO2KtDcP + ac5m6vkndzXTPqzaVaWTNqb9dC33pE49JtJ+aWXQtNk6mURERPZQdHHQjVzTs6V0cW960/7wofcf/eWr + D9+8bfSPuV0/0W71JE4Up7tt48tX3/8jHzz6zW/+/lCWtbyUhmDUEZWPWr8lNU/nUIZOzFM3Kl11cWXT + YomzVLNNvbT221KlXnCkvbFsma2TSUREZA9FFwfdyDU9W0oX99u//cDwyT8+4mtfPOzAN+JuHP3D3Knd + 6kmcKE737Y2/+9Jhn/r4Ee95zwNDWdbyUvcwdaY2M2XffN/+mtUX1Y1KJ13c1HXuImW62R1R2T372ue8 + rirVyEiarZNJRERkD0UXB93INT1bShf3kY8cFf7LZx7w9b859MDPN95wcLu4ON3NG9/4yqH/9bOH/6f/ + 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 + oYs7//wTfvqnfzQauV+98pjf/Z0Hf/bTR/71NQd+a+XdNx/4593ujWbsho3Nb44as2+MRJOWVNtjQAy7 + YfRPe3/rwD8qEJPEVDHhe3/nwb/2a8dEC/czP/OjcbpyYl3cCqX+t7kX+Ye5O5lERET2UHRx0I1c07Ml + dnGRqpU6/fSTnv3sEy+99IkvefGxr33tw97+tv1/8OEHfukLh3/v9tE/CH7r6FtqN49+Q0mzo6uNOrfq + 778dGHbLRhxy4J/2vn1fTBJTxYSve+3DXvKSYy+99Pho4c4446TqvGURIiIisq7RxUE3ck3PltvFVal6 + qsg55zzlkkse86IXPewtb9l/1VVHHfgHwe/ad/d3Njbv2ti8Y2PzttFfcos+7aZRz1aLMjbGrhgQw+7a + iEPiwDg8Jompqt9IGZOX0+jfREREZBRdHHQj1/RsUF3cGWc87bzzjo+O6+Uvf+Q73nHMRz/6/X/0sQf9 + yceP/uxVR1795w/48l/c/+++dNg3/ubQm752yK3X3a8WZWyMXTEghsXgOCQOjMNjkpiq/o2U5TS6OBER + ERlFFwfdyDU9G0IXF6maq2c+8+Totc4994TLLz/uiise+4pXPOp1r334v33jMW9/6/53/9aDPvLBoz/1 + 8SP+658d/t+uuf91f3toLcrYGLtiQAyLwXFIHBiHxyQxVUxY/UbK6izllCIiIrL20cVBN3JNzwbSxaWc + dtopp5xy0sknP/Wss467+OJHv+hFD/vlX37Im9/8/e95zwP/03866jOfecCXv3z/WpSxMXbFgBgWg+OQ + ODAOj0liqjKpiIiIyNbo4qAbuaZnujgRERFZ2+jioBu5pmfD7OJEREREDkJ0cdCNXNMzXZyIiIisbXRx + 0I1c0zNdnIiIiKxtdHHQjVzTM12ciIiIrG10cdCNXNMzXZyIiIisbXRx0I1c0zNdnIiIiKxtdHHQjVzT + M12ciIiIrG10cdCNXNMzXZyIiIisbXRx0I1c0zNdnIiIiKxtdHHQjVzTM12ciIiIrG10cdCNXNMzXZyI + iIisbXRx0I1c0zNdnIiIiKxtdHHQjVzTM12ciIiIrG10cdCNXNMzXZyIiIisbXRx0I1c0zNdnIiIiKxt + dHHQjVzTM12ciIiIrG10cdCNXNMzXZyIiIisbXRx0I1c0zNdnIiIiKxtdHHQjVzTM12ciIiIrG10cdCN + XNMzXZyIiIisbXRx0I1c0zNdnIiIiKxtdHHQjVzTM12ciIiIrG10cdCNXNMzXZyIiIisbXRx0I1c0zNd + nIiIiKxtdHHQjVzTs7qLu0BERERkzaKLg27kmp7p4kRERGRto4uDbuSanuniREREZG2ji4Nu5Jqe6eJE + RERkbaOLg27kmp7p4kRERGRto4uDbuSanuniREREZG2ji4Nu5Jqe6eJERERkbaOLg27kmp7p4kRERGRt + o4uDbuSanuniREREZG2ji4Nu5Jqe6eJERERkbaOLg27kmp7p4kRERGRto4uDbuSanuniREREZG2ji4Nu + 5Jqe6eJERERkbaOLg27kmp7p4kRERGRto4uDbuSanuniREREZG2ji4Nu5Jqe6eJERERkbaOLg27kmp7p + 4kRERGRto4uDbuSanuniREREZG2ji4Nu5Jqe6eJERERkbaOLg27kmp7p4kRERGRto4uDbuSanuniRERE + ZG2ji4Nu5Jqe6eJERERkbaOLg27kmp7p4kRERGRto4uDbuSanuniREREZG2ji4Nu5Jqe6eJERERkbaOL + g27kmp6tWBf36U9/unwkIiIisl10cdCNXNOzVerirr322s3NzfjfUouIiIi0RhcH3cg1PVuZLu7Tn/50 + tHBVNHJLzK//+q/Hs4j/LfUgEyusUupdZfEZRKam+kNUpWySYaR+NLv4T1x1YKTUMpjo4qAbuaZnK9PF + lQZunOE3cuXr+U6+opcDBvwSEG825QFsbg65kStL3Nws9c5TfeM34v8ykA7T/BNUxSfYoBL/+a2eyy7+ + O1wdGCm1DCa6OOhGrunZanRx9VfWZgb+9lNWuZNupxww4Aap+SCG3G2WJS7wOlWOH6VsElksky1cRBc3 + qOjiVjK6OOhGrunZanRx9TdG4itr/XFkyC9AZYmr1cU1X0OXu8j2s5cl+l6cDCnVZ1QkPqniE7hO2b3G + Gc5N0MWtZHRx0I1c07PV6OLK18bxV8c90ciV9a1WFxeJtcX7zRJXWL9mlXpaqgGRUu8qcaJIKUQWS/yR + KZ+U3vIbmeeP88FMvZ5d/NmvDoyUWgYTXRx0I9f0bCW7uMjwG7myuJXr4paeco9aX5XKCK9TMpgs0h6s + cKp7Ein1sqOLW8no4qAbuaZnK9bFNdubgTdyZWW6uK5T7pEuTvZU6v9e6eKaqe5JpNTLji5uJaOLg27k + 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 + IiIy8NRdXKRq5J785CevXiOni4Nu5Jqe6eJERERkMs0uLnLzzTevZCOni4Nu5Jqe6eJERERkMqmLi6RG + bjV+a6UuDrqRa3qmixMREZHJTHZxkW9961sr1sjp4qAbuaZnujgRERGZzNQuLlI1ck95ylNWo5HTxUE3 + ck3PdHEiIiIymVldXGSVGjldHHQj1/RMFyciIiKTaeniIivTyOnioBu5pme6OBEREZlMexcXWY1GThcH + 3cg1PdPFiYiIyGS27eIiK9DI6eKgG7mmZ7o4ERERmcw8XVzkpptu2tONnC4OupFreqaLExERkcnM2cVF + 9nQjp4uDbuSanuniREREZDLzd3GRZiN35pln7qFGThcH3cg1PdPFiYiIyGR21MVFbrzxxmjkTjjhhGc8 + 4xl7qJHTxUE3ck3PdHEiIiIymZ12cZEbbrhhzzVyujjoRq7pmS5OREREJrOLLi6y5xo5XRx0I9f0TBcn + IiIik9ldFxfZW42cLg66kWt6posTERGRyey6i4vsoUZOFwfdyDU908WJiIjIZBbp4iLRyN3vfvcbfiOn + i4Nu5Jqe6eJERERkMgt2cZGqkXvCE54w5EZOFwfdyDU908WJiIjIZObs4n72Z382Rrbk0EMP/Ymf+Imf + /MmfPPvss88///znPOc55QTDiC4OupFreqaLExERkclEA1YatUa+853v3HrrraUYJYadNMrJJ5982mmn + RcP2jyfyjGc84/TTT48u7rzzztPFwWrKNT3TxYmIiMhkJru4r371q4cffvghhxxy1113lU2bm0972tMe + //jH//iP//ipp576zGc+84wzzjjrrLOiYUs555xzqp+o1MXBaso1PdPFiYiIyGRSF1e1cE960pMe8pCH + vOENbyhbNzf//b//9/v3748u7rTTTvvJn/zJ6NbOO++88ycS/dsAW7iILg66kWt6posTERGRyTS7uLqF + i27thBNO+OEf/uGyY3Pz7rvvrv5RgVNPPfVZz3pWdHHRrZUp9kJ0cdCNXNOzuot7uoiIiMg4dRcXLdz9 + 73//Y4899glPeMLxxx//lKc85UEPetD73ve+am/k1a9+9Q/8wA8cd9xxT37yk3/sx37slFNOOe2008os + g48uDrqRa3qmixMREZHJVF1c1cI95jGPqVu4pz3taY973ONOP/30qoWLXH/99YceeuiP/uiPPvGJTzzx + xBOrn64ssww+ujjoRq7pmS5OREREJhNdXPWDlI9//OOjf6tbuJNPPvnUU0894ogjvvCFL5Q2bnPzRS96 + 0UMf+tDmt+PKLIOPLg66kWt6posTERGRyUQXV/1duGjeqv+tWrjq+2yPetSjrrjiitLDbW5+7nOfi8FP + eMITnvjEJz71qU+thw0/ujjoRq7pmS5OREREJrN///4f+7Ef+/Ef//Hoyk488cT4uNmbxceHHHJI89+O + O/300x/xiEccd9xx0e+ddNJJp556ajVy4NHFQTdyTc90cSIiIjI10bOdcsop0chFJr+99tCHPvTKK68s + Pdzm5p/92Z898IEPfMITnvCkJz2p+V27gUcXB93INT3TxYmIiMjURBsWOXWUyZbsxBNPfPSjH121cLfe + euu//tf/et++fY997GOr33Gii4P1kmt6posTERGRlrQ0Yw9+8IM/8IEPvOIVrzjkkEP279//Iz/yI8cd + d9yTnvSkPfRX43Rx0I1c0zNdnIiIiOwuj3/84w877LCHPexh0blVefKTn3ziiSeedNJJe+VfjdPFQTdy + Tc90cSIiIrK7RJ8W3Vok2ranjlL9QpS90sJFdHHQjVzTM12ciIiILJKqlzt5lKp/2ystXEQXB93INT3T + xYmIiMiCqTq3KmXTHokuDrqRa3qmixMREZG1jS4OupFreqaLExERkbWNLg66kWt6posTERGRtY0uDrqR + a3qmixMREZG1jS4OupFreqaLExERkbWNLg66kWt6posTERGRtY0uDrqRa3qmixMREZG1jS4OupFreqaL + ExERkbWNLg66kWt6posTERGRtY0uDrqRa3qmixMREZG1jS4OupFreqaLExERkbWNLg66kWt6posTERGR + tY0uDrqRa3qmixMREZG1jS4OupFreqaLExERkbWNLg66kWt6posTERGRtY0uDrqRa3qmi9vr+eQ4pZZd + ZQj38E1velO1jPigbBIRkZ6ji4Nu5Jqe6eIGmHiJr1/oq7S81m+OU2rZeb72ta9V9zA+KJuWkXjQ1TLi + g7JJRER6ji4OupFreqaLG06qzq16j5+aqT1G2aeLWyDlDo5SNi0jujgRkYMfXRx0I9f0bCBdXDQw8fLa + 8h2nxRMt0HK/09KSuPBYW/UGv23KMeOUrbq4BVLf/OV+hujiREQOfnRx0I1c07MhdHFVC1elp0ZuIK/p + U9O8/CqxyHiPb6Zef6QcNk7ZqotbLNV9LsWSEguoHuXSVyIisj7RxUE3ck3PhtDFRZpdSueNXK+TL5jU + wrW/vlcXUopxqgMjpZY9G12ciMjBjy4OupFrejaQLi7SU6+1V1q4WOc8y5scU47Xxe396OJERA5+dHHQ + jVzTs+F0cZHOO6491MKVrTtPmUIXt/ejixMROfjRxUE3ck3PBtXFRTrsu4bcwkWayyubdpUyhS5u70cX + JyJy8KOLg27kmp4NrYuLdNJ9DbyFa34jbsHllVnm6+LiXNEh1NnFqcuRo8x5eDpp2brDNCcpm6aljJg9 + Zuo89cbJK5q1q9oYie1p17aJ8eXgrdNGWT3K+KBsmp3mJJH2NZRBrcPqCVvGVAMi7acTEdlD0cVBN3JN + zwbYxUUW7MEG3sJF4j24rG/h76GVWbabp3lPUmIxZdDsNBec0v7SXwZtTSymjJg789yxWEkZMXtMPU/z + qqdurDK5a+qdnDxwaurZUqp7OHmuqdnFoyy7W2eup20ZUw2IlFpEZO9HFwfdyDU9G2YXF2m+qu6oE9v1 + gQczZX1zv/23pEw0R9/SnpZ71dI2RKZeQrOhmpqYc6dPpxw5e6nNK511Y8vurZPUB04e1dzVflFxReWY + aZnnhrQso0o9oD2T96c+sGWR1YAqZdPWzDOJiMieiy4OupFrejbYLi4SL4vVW2Nk1ot7yi4OOfhpvtAv + vsgy0Yw37+YNiY/jRTzOWCd1BbGlHNZIc4bJw6uUoePErnLAKDGgGh+Jj8vWnTcD9Uomz1il2ltl6uSx + gLJ76+2qVzU5c3NXtYD43/i4upxIvarI5OFVYlgZMUrz8HraSP3B1HmaJ0priERZ9o0SW8pho0RZdmzX + oVVJh1dpX56IyB6NLg66kWt6NuQuLtJ8c536ZtnMjgYvMdu+Uu8oZaJpUzVPFDenbN2abceUfTu5pfWD + mHXSesCO+oG605g6bfNCqpQdjdRj0nnrmSfXU++qMjkgUl9OpGzamuYNmXob0+Inz9IcMPXyI+1jyo7t + OrQq7ZdZahGRlYguDrqRa3o28C4u0ny/nPoCWmXOYUNI8227bFogZaJpU9X3JD4om6aluZ506+oepn2G + Zua5unrM/NNWqY6KlLqReqn1B+laIrN2NY8tm8apd0VmrbZ5yZMnbd9bp3miyWV0+CgnJ4/Uu6oPpp6l + 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 + El0cdCPX9Gw4XVxPHZdGTkRERGZFFwfdyDU9G0gX12uvpZETERGRqdHFQTdyTc+G0MVFZ1V6rN66rLqR + iw/KJhEREVn76OKgG7mmZ0Po4iJVI9frN8qif9PCiYiISDO6OOhGrunZQLo4ERERkYMfXRx0I9f0TBcn + IiIiaxtdHHQj1/RMFyciIiJrG10cdCPX9EwXJyIiImsbXRx0I9f0TBcnIiIiaxtdHHQj1/RMFyciIiJr + G10cdCPX9EwXJyIiImsbXRx0I9f0TBcnIiIiaxtdHHQj1/RMFyciIiJrG10cdCPX9EwXJyIiImsbXRx0 + I9f0TBcnIiIiaxtdHHQj1/RMFyciIiJrG10cdCPX9EwXJyIiImsbXRx0I9f0TBcnIiIiaxtdHHQj1/RM + FyciIiJrG10cdCPX9EwXJyIiImsbXRx0I9f0TBcnIiIiaxtdHHQj1/RMFyciIiJrG10cdCPX9EwXJyIi + ImsbXRx0I9f0TBcnIiIiaxtdHHQj1/RMFyciIiJrG10cdCPX9EwXJyIiImsbXRx0I9f0TBcnIiIiaxtd + HHQj1/RMFyciIiJrG10cdCPX9EwXJyIiImsbXRx0I9f0TBcnIiIiaxtdHHQj1/RMFyciIiJrG10cdCPX + 9EwXJyIiImsbXRx0I9f0TBcnIiIiaxtdHHQj1/RMFyciIiJrG10cdCPX9EwXJyIiImsbXRx0I9f0TBcn + IiIiaxtdHHQj1/RMFyciIiJrG10cdCPX9EwXJyIiImsbXRx0I9f0TBcnIiIiaxtdHHQj1/RMFyciIiJr + G10cdCPX9EwXJyIiImsbXRx0I9f0TBcnIiIiaxtdHHQj1/RMFyciIiJrG10cdCPX9EwXJyIiImsbXRx0 + I9f0TBcnIiIiaxtdHHQj1/RMFyciIiJrG10cdCPX9EwXJyIiImsbXRx0I9f0TBcnIiIiaxtdHHQj1/RM + FyciIiJrG10cdCPX9EwXJyIiImsbXRx0I9f0TBcnIiIiaxtdHHQj1/RMFyciIiJrG10cdCPX9EwXJyIi + ImsbXRx0I9f0TBcnIiIiaxtdHHQj1/RMFyciIiJrG10cdCPX9EwXJyIiImsbXRx0I9f0TBcnIiIiaxtd + HHQj1/RMFyciIiJrG10cdGPj+44BYKrTn3MZe0h6fACwsnINwFhqEhi49PgAYGXlGoCx1CQwcOnxAcDK + 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 + 6fuO+f8BEkV7u3LoscQAAAAASUVORK5CYII= + + + \ No newline at end of file diff --git a/T7EPreferences/Preferences.cs b/T7EPreferences/Preferences.cs index 1d9b161..bf78dfa 100644 --- a/T7EPreferences/Preferences.cs +++ b/T7EPreferences/Preferences.cs @@ -293,6 +293,7 @@ static public void EraseJumplist(string appId) try { JumpList dummyList = JumpList.CreateJumpListForAppId(appId); + dummyList.ClearAllUserTasks(); dummyList.Refresh(); // Set appid back @@ -304,15 +305,16 @@ static public void EraseJumplist(string appId) static public void SetAppIdBackAfterJumplist() { JumpList ownList = JumpList.CreateJumpListForAppId("T7E.Meta"); - ownList.AddUserTasks(new JumpListLink + // BUG: WE NEED TO FIGURE OUT HOW TO RETURN JUMP LIST TO NORMAL + /*ownList.AddUserTasks(new JumpListLink { Title = "Visit the official website", Path = "%windir%\\explorer.exe", Arguments = "\"http://jumplist.gsdn-media.com\"", IconReference = new IconReference(Path.Combine(Common.EnvPath_SystemRoot, "system32\\shell32.dll"), 135) - }); + });*/ ownList.Refresh(); - Common.TaskbarManagerInstance.SetCurrentProcessAppId("T7E.Meta"); + Common.TaskbarManagerInstance.SetCurrentProcessAppId(""); } static public bool ApplyJumplistToTaskbar(Primary parent) @@ -414,11 +416,12 @@ static public bool ApplyJumplistToTaskbar(Primary parent) // //////// JumpList dummyList = JumpList.CreateJumpListForAppId(parent.CurrentAppId); - dummyList.AddUserTasks(new JumpListLink + /*dummyList.AddUserTasks(new JumpListLink { Title = "Dummy", Path = "%windir%\\explorer.exe" - }); + });*/ + dummyList.ClearAllUserTasks(); dummyList.Refresh(); newList.Refresh(); // Remove appid from own window! @@ -434,6 +437,29 @@ static public bool ApplyJumplistToTaskbar(Primary parent) return result; } + static public bool ApplyBlankJumplistToTaskbar(Primary parent) + { + bool result = false; + + try + { + // //////// + JumpList dummyList = JumpList.CreateJumpListForAppId(parent.CurrentAppId); + dummyList.ClearAllUserTasks(); + dummyList.Refresh(); + // Remove appid from own window! + SetAppIdBackAfterJumplist(); + result = true; + } + catch (Exception e) + { + MessageBox.Show("JumpList applying not successful." + "\r\n" + + e.ToString()); + } + + return result; + } + static private JumpListLink ParseApplyJumpListTask(Primary parent, T7EJumplistItem jumplistItem, int itemIndex) { JumpListLink task = new JumpListLink @@ -774,7 +800,23 @@ public static void WriteAppListXml() string appListXmlPath = Path.Combine(Common.Path_AppData, "AppList.xml"); if (File.Exists(appListXmlPath)) File.Copy(appListXmlPath, appListXmlPath + ".bak", true); - XmlTextWriter xmlWriter = new XmlTextWriter(appListXmlPath, null); + + XmlTextWriter xmlWriter; + int retries = 10; + while (true) + { + try + { + xmlWriter = new XmlTextWriter(appListXmlPath, null); + break; // success! + } + catch + { + if (--retries == 0) return; + else System.Threading.Thread.Sleep(500); + } + } + xmlWriter.WriteStartElement("appList"); xmlWriter.WriteAttributeString("cleanAppIdsOnExit", "false"); for (int i = 0; i < Common.AppCount; i++) diff --git a/T7EPreferences/Primary.Designer.cs b/T7EPreferences/Primary.Designer.cs index ac84136..2141567 100644 --- a/T7EPreferences/Primary.Designer.cs +++ b/T7EPreferences/Primary.Designer.cs @@ -75,6 +75,8 @@ private void InitializeComponent() this.TaskKBDTextBox = new System.Windows.Forms.TextBox(); this.TaskKBDLabel = new System.Windows.Forms.Label(); this.TaskKBDSettingsPanel = new System.Windows.Forms.Panel(); + this.TaskKBDMinimizeAfterwardCheckBox = new System.Windows.Forms.CheckBox(); + this.TaskKBDSendInBackgroundCheckBox = new System.Windows.Forms.CheckBox(); this.TaskKBDIgnoreCurrentCheckBox = new System.Windows.Forms.CheckBox(); this.TaskKBDIgnoreAbsentCheckBox = new System.Windows.Forms.CheckBox(); this.TaskKBDNewCheckBox = new System.Windows.Forms.CheckBox(); @@ -134,8 +136,9 @@ private void InitializeComponent() this.ProgramNameTextBox = new System.Windows.Forms.TextBox(); this.ProgramNameLabel = new System.Windows.Forms.Label(); this.TabControl = new System.Windows.Forms.TabControl(); - this.TaskKBDSendInBackgroundCheckBox = new System.Windows.Forms.CheckBox(); - this.TaskKBDMinimizeAfterwardCheckBox = new System.Windows.Forms.CheckBox(); + this.OptionToolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.HidePinPromptOptionalOptionMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.HidePinWarningOptionMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.MenuStrip.SuspendLayout(); this.StatusBar.SuspendLayout(); this.AddButtonContextMenuStrip.SuspendLayout(); @@ -166,7 +169,8 @@ private void InitializeComponent() this.updateToVersion0ToolStripMenuItem}); this.MenuStrip.Location = new System.Drawing.Point(0, 0); this.MenuStrip.Name = "MenuStrip"; - this.MenuStrip.Size = new System.Drawing.Size(820, 26); + this.MenuStrip.Padding = new System.Windows.Forms.Padding(5, 2, 0, 2); + this.MenuStrip.Size = new System.Drawing.Size(656, 24); this.MenuStrip.TabIndex = 0; this.MenuStrip.Text = "menuStrip1"; // @@ -183,14 +187,14 @@ private void InitializeComponent() this.MenuFileSeparator2, this.MenuFileExit}); this.MenuFileMenu.Name = "MenuFileMenu"; - this.MenuFileMenu.Size = new System.Drawing.Size(40, 22); + this.MenuFileMenu.Size = new System.Drawing.Size(37, 20); this.MenuFileMenu.Text = "&File"; // // newToolStripMenuItem // this.newToolStripMenuItem.Name = "newToolStripMenuItem"; this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); - this.newToolStripMenuItem.Size = new System.Drawing.Size(301, 22); + this.newToolStripMenuItem.Size = new System.Drawing.Size(252, 22); this.newToolStripMenuItem.Text = "&New"; this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); // @@ -198,7 +202,7 @@ private void InitializeComponent() // this.MenuFileOpen.Name = "MenuFileOpen"; this.MenuFileOpen.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); - this.MenuFileOpen.Size = new System.Drawing.Size(301, 22); + this.MenuFileOpen.Size = new System.Drawing.Size(252, 22); this.MenuFileOpen.Text = "&Open and Edit Jump Lists"; this.MenuFileOpen.Click += new System.EventHandler(this.MenuFileOpen_Click); // @@ -206,7 +210,7 @@ private void InitializeComponent() // this.MenuFileSave.Enabled = false; this.MenuFileSave.Name = "MenuFileSave"; - this.MenuFileSave.Size = new System.Drawing.Size(301, 22); + this.MenuFileSave.Size = new System.Drawing.Size(252, 22); this.MenuFileSave.Text = "&Save"; this.MenuFileSave.Visible = false; this.MenuFileSave.Click += new System.EventHandler(this.MenuFileSave_Click); @@ -215,40 +219,40 @@ private void InitializeComponent() // this.saveAndApplyToTaskbarToolStripMenuItem.Name = "saveAndApplyToTaskbarToolStripMenuItem"; this.saveAndApplyToTaskbarToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.S))); - this.saveAndApplyToTaskbarToolStripMenuItem.Size = new System.Drawing.Size(301, 22); + this.saveAndApplyToTaskbarToolStripMenuItem.Size = new System.Drawing.Size(252, 22); this.saveAndApplyToTaskbarToolStripMenuItem.Text = "Save and &Apply to Taskbar"; this.saveAndApplyToTaskbarToolStripMenuItem.Click += new System.EventHandler(this.saveAndApplyToTaskbarToolStripMenuItem_Click); // // MenuFileSeparator1 // this.MenuFileSeparator1.Name = "MenuFileSeparator1"; - this.MenuFileSeparator1.Size = new System.Drawing.Size(298, 6); + this.MenuFileSeparator1.Size = new System.Drawing.Size(249, 6); // // importProgramSettingsToolStripMenuItem // this.importProgramSettingsToolStripMenuItem.Name = "importProgramSettingsToolStripMenuItem"; this.importProgramSettingsToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); - this.importProgramSettingsToolStripMenuItem.Size = new System.Drawing.Size(301, 22); - this.importProgramSettingsToolStripMenuItem.Text = "I&mport Jumplist Pack"; + this.importProgramSettingsToolStripMenuItem.Size = new System.Drawing.Size(252, 22); + this.importProgramSettingsToolStripMenuItem.Text = "I&mport Jump List Pack"; this.importProgramSettingsToolStripMenuItem.Click += new System.EventHandler(this.importProgramSettingsToolStripMenuItem_Click); // // MenuFileExport // this.MenuFileExport.Name = "MenuFileExport"; this.MenuFileExport.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.P))); - this.MenuFileExport.Size = new System.Drawing.Size(301, 22); - this.MenuFileExport.Text = "Ex&port Jumplist Pack"; + this.MenuFileExport.Size = new System.Drawing.Size(252, 22); + this.MenuFileExport.Text = "Ex&port Jump List Pack"; this.MenuFileExport.Click += new System.EventHandler(this.MenuFileExport_Click); // // MenuFileSeparator2 // this.MenuFileSeparator2.Name = "MenuFileSeparator2"; - this.MenuFileSeparator2.Size = new System.Drawing.Size(298, 6); + this.MenuFileSeparator2.Size = new System.Drawing.Size(249, 6); // // MenuFileExit // this.MenuFileExit.Name = "MenuFileExit"; - this.MenuFileExit.Size = new System.Drawing.Size(301, 22); + this.MenuFileExit.Size = new System.Drawing.Size(252, 22); this.MenuFileExit.Text = "E&xit"; this.MenuFileExit.Click += new System.EventHandler(this.MenuFileExit_Click); // @@ -257,6 +261,9 @@ private void InitializeComponent() this.MenuToolsMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.MenuToolsPreferences, this.keyboardShortcutHelpToolStripMenuItem, + this.OptionToolStripSeparator, + this.HidePinPromptOptionalOptionMenuItem, + this.HidePinWarningOptionMenuItem, this.MenuToolsSeparator1, this.donateToolStripMenuItem, this.disableDonationBalloonToolStripMenuItem, @@ -264,14 +271,14 @@ private void InitializeComponent() this.toolStripSeparator1, this.MenuToolsAbout}); this.MenuToolsMenu.Name = "MenuToolsMenu"; - this.MenuToolsMenu.Size = new System.Drawing.Size(55, 22); + this.MenuToolsMenu.Size = new System.Drawing.Size(47, 20); this.MenuToolsMenu.Text = "Tool&s"; // // MenuToolsPreferences // this.MenuToolsPreferences.Enabled = false; this.MenuToolsPreferences.Name = "MenuToolsPreferences"; - this.MenuToolsPreferences.Size = new System.Drawing.Size(264, 22); + this.MenuToolsPreferences.Size = new System.Drawing.Size(245, 22); this.MenuToolsPreferences.Text = "&Preferences"; this.MenuToolsPreferences.Visible = false; // @@ -279,45 +286,49 @@ private void InitializeComponent() // this.keyboardShortcutHelpToolStripMenuItem.Name = "keyboardShortcutHelpToolStripMenuItem"; this.keyboardShortcutHelpToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.K))); - this.keyboardShortcutHelpToolStripMenuItem.Size = new System.Drawing.Size(264, 22); + this.keyboardShortcutHelpToolStripMenuItem.Size = new System.Drawing.Size(245, 22); this.keyboardShortcutHelpToolStripMenuItem.Text = "&Key Shortcut Help"; this.keyboardShortcutHelpToolStripMenuItem.Click += new System.EventHandler(this.keyboardShortcutHelpToolStripMenuItem_Click); // // MenuToolsSeparator1 // this.MenuToolsSeparator1.Name = "MenuToolsSeparator1"; - this.MenuToolsSeparator1.Size = new System.Drawing.Size(261, 6); + this.MenuToolsSeparator1.Size = new System.Drawing.Size(242, 6); + this.MenuToolsSeparator1.Visible = false; // // donateToolStripMenuItem // this.donateToolStripMenuItem.Name = "donateToolStripMenuItem"; - this.donateToolStripMenuItem.Size = new System.Drawing.Size(264, 22); + this.donateToolStripMenuItem.Size = new System.Drawing.Size(245, 22); this.donateToolStripMenuItem.Text = "&Donate to Jumplist Extender!"; + this.donateToolStripMenuItem.Visible = false; this.donateToolStripMenuItem.Click += new System.EventHandler(this.donateToolStripMenuItem_Click); // // disableDonationBalloonToolStripMenuItem // this.disableDonationBalloonToolStripMenuItem.Name = "disableDonationBalloonToolStripMenuItem"; - this.disableDonationBalloonToolStripMenuItem.Size = new System.Drawing.Size(264, 22); + this.disableDonationBalloonToolStripMenuItem.Size = new System.Drawing.Size(245, 22); this.disableDonationBalloonToolStripMenuItem.Text = "D&isable Donation Balloon"; + this.disableDonationBalloonToolStripMenuItem.Visible = false; this.disableDonationBalloonToolStripMenuItem.Click += new System.EventHandler(this.disableDonationBalloonToolStripMenuItem_Click); // // visitTheOfficialWebsiteToolStripMenuItem // this.visitTheOfficialWebsiteToolStripMenuItem.Name = "visitTheOfficialWebsiteToolStripMenuItem"; - this.visitTheOfficialWebsiteToolStripMenuItem.Size = new System.Drawing.Size(264, 22); + this.visitTheOfficialWebsiteToolStripMenuItem.Size = new System.Drawing.Size(245, 22); this.visitTheOfficialWebsiteToolStripMenuItem.Text = "&Visit the Official Website"; + this.visitTheOfficialWebsiteToolStripMenuItem.Visible = false; this.visitTheOfficialWebsiteToolStripMenuItem.Click += new System.EventHandler(this.visitTheOfficialWebsiteToolStripMenuItem_Click); // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(261, 6); + this.toolStripSeparator1.Size = new System.Drawing.Size(242, 6); // // MenuToolsAbout // this.MenuToolsAbout.Name = "MenuToolsAbout"; - this.MenuToolsAbout.Size = new System.Drawing.Size(264, 22); + this.MenuToolsAbout.Size = new System.Drawing.Size(245, 22); this.MenuToolsAbout.Text = "&About"; this.MenuToolsAbout.Click += new System.EventHandler(this.MenuToolsAbout_Click); // @@ -325,7 +336,7 @@ private void InitializeComponent() // this.updateToVersion0ToolStripMenuItem.Enabled = false; this.updateToVersion0ToolStripMenuItem.Name = "updateToVersion0ToolStripMenuItem"; - this.updateToVersion0ToolStripMenuItem.Size = new System.Drawing.Size(168, 22); + this.updateToVersion0ToolStripMenuItem.Size = new System.Drawing.Size(132, 20); this.updateToVersion0ToolStripMenuItem.Text = "&Update to Version {0}!"; this.updateToVersion0ToolStripMenuItem.Visible = false; this.updateToVersion0ToolStripMenuItem.Click += new System.EventHandler(this.updateToVersion0ToolStripMenuItem_Click); @@ -334,15 +345,17 @@ private void InitializeComponent() // this.StatusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ToolBarStatusLabel}); - this.StatusBar.Location = new System.Drawing.Point(0, 567); + this.StatusBar.Location = new System.Drawing.Point(0, 450); this.StatusBar.Name = "StatusBar"; - this.StatusBar.Size = new System.Drawing.Size(820, 23); + this.StatusBar.Padding = new System.Windows.Forms.Padding(1, 0, 11, 0); + this.StatusBar.Size = new System.Drawing.Size(656, 22); this.StatusBar.TabIndex = 2; + this.StatusBar.Click += new System.EventHandler(this.StatusBar_Click); // // ToolBarStatusLabel // this.ToolBarStatusLabel.Name = "ToolBarStatusLabel"; - this.ToolBarStatusLabel.Size = new System.Drawing.Size(49, 18); + this.ToolBarStatusLabel.Size = new System.Drawing.Size(39, 17); this.ToolBarStatusLabel.Text = "Ready"; // // AddButtonContextMenuStrip @@ -353,33 +366,33 @@ private void InitializeComponent() this.newCategoryToolStripMenuItem, this.newSeparatorToolStripMenuItem}); this.AddButtonContextMenuStrip.Name = "AddButtonContextMenuStrip"; - this.AddButtonContextMenuStrip.Size = new System.Drawing.Size(234, 92); + this.AddButtonContextMenuStrip.Size = new System.Drawing.Size(206, 92); // // newTaskToolStripMenuItem // this.newTaskToolStripMenuItem.Name = "newTaskToolStripMenuItem"; - this.newTaskToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.newTaskToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.newTaskToolStripMenuItem.Text = "New Task"; this.newTaskToolStripMenuItem.Click += new System.EventHandler(this.newTaskToolStripMenuItem_Click); // // newFileFolderToolStripMenuItem // this.newFileFolderToolStripMenuItem.Name = "newFileFolderToolStripMenuItem"; - this.newFileFolderToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.newFileFolderToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.newFileFolderToolStripMenuItem.Text = "New File/Folder Shortcut"; this.newFileFolderToolStripMenuItem.Click += new System.EventHandler(this.newFileFolderToolStripMenuItem_Click); // // newCategoryToolStripMenuItem // this.newCategoryToolStripMenuItem.Name = "newCategoryToolStripMenuItem"; - this.newCategoryToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.newCategoryToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.newCategoryToolStripMenuItem.Text = "New Category"; this.newCategoryToolStripMenuItem.Click += new System.EventHandler(this.newCategoryToolStripMenuItem_Click); // // newSeparatorToolStripMenuItem // this.newSeparatorToolStripMenuItem.Name = "newSeparatorToolStripMenuItem"; - this.newSeparatorToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.newSeparatorToolStripMenuItem.Size = new System.Drawing.Size(205, 22); this.newSeparatorToolStripMenuItem.Text = "New Separator"; this.newSeparatorToolStripMenuItem.Click += new System.EventHandler(this.newSeparatorToolStripMenuItem_Click); // @@ -390,34 +403,34 @@ private void InitializeComponent() this.TabJumplist.Controls.Add(this.JumplistPanel); this.TabJumplist.Controls.Add(this.JumplistEnableCheckBox); this.TabJumplist.Controls.Add(this.JumplistHelpText); - this.TabJumplist.Location = new System.Drawing.Point(4, 25); + this.TabJumplist.Location = new System.Drawing.Point(4, 22); this.TabJumplist.Margin = new System.Windows.Forms.Padding(2); this.TabJumplist.Name = "TabJumplist"; this.TabJumplist.Padding = new System.Windows.Forms.Padding(2); - this.TabJumplist.Size = new System.Drawing.Size(812, 507); + this.TabJumplist.Size = new System.Drawing.Size(648, 403); this.TabJumplist.TabIndex = 0; this.TabJumplist.Text = "Jumplist"; this.TabJumplist.UseVisualStyleBackColor = true; // // ItemTypePanel // - this.ItemTypePanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.ItemTypePanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.ItemTypePanel.Controls.Add(this.TaskGroupBox); this.ItemTypePanel.Controls.Add(this.FileGroupBox); this.ItemTypePanel.Enabled = false; - this.ItemTypePanel.Location = new System.Drawing.Point(309, 112); + this.ItemTypePanel.Location = new System.Drawing.Point(247, 90); this.ItemTypePanel.Margin = new System.Windows.Forms.Padding(2); this.ItemTypePanel.Name = "ItemTypePanel"; - this.ItemTypePanel.Size = new System.Drawing.Size(500, 408); + this.ItemTypePanel.Size = new System.Drawing.Size(400, 326); this.ItemTypePanel.TabIndex = 16; // // TaskGroupBox // - this.TaskGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.TaskGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.TaskGroupBox.Controls.Add(this.TaskActionLabel); this.TaskGroupBox.Controls.Add(this.TaskActionComboBox); this.TaskGroupBox.Controls.Add(this.TaskKBDPanel); @@ -428,7 +441,7 @@ private void InitializeComponent() this.TaskGroupBox.Margin = new System.Windows.Forms.Padding(2); this.TaskGroupBox.Name = "TaskGroupBox"; this.TaskGroupBox.Padding = new System.Windows.Forms.Padding(2); - this.TaskGroupBox.Size = new System.Drawing.Size(500, 386); + this.TaskGroupBox.Size = new System.Drawing.Size(400, 309); this.TaskGroupBox.TabIndex = 3; this.TaskGroupBox.TabStop = false; this.TaskGroupBox.Text = "Task Properties"; @@ -437,51 +450,51 @@ private void InitializeComponent() // TaskActionLabel // this.TaskActionLabel.AutoSize = true; - this.TaskActionLabel.Location = new System.Drawing.Point(6, 22); + this.TaskActionLabel.Location = new System.Drawing.Point(5, 18); this.TaskActionLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.TaskActionLabel.Name = "TaskActionLabel"; - this.TaskActionLabel.Size = new System.Drawing.Size(51, 17); + this.TaskActionLabel.Size = new System.Drawing.Size(40, 13); this.TaskActionLabel.TabIndex = 0; this.TaskActionLabel.Text = "A&ction:"; // // TaskActionComboBox // - this.TaskActionComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.TaskActionComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.TaskActionComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.TaskActionComboBox.FormattingEnabled = true; this.TaskActionComboBox.Items.AddRange(new object[] { "Send keystrokes to window", "Run command line or program", "Run AutoHotKey script"}); - this.TaskActionComboBox.Location = new System.Drawing.Point(59, 19); + this.TaskActionComboBox.Location = new System.Drawing.Point(47, 15); this.TaskActionComboBox.Margin = new System.Windows.Forms.Padding(2); this.TaskActionComboBox.Name = "TaskActionComboBox"; - this.TaskActionComboBox.Size = new System.Drawing.Size(428, 24); + this.TaskActionComboBox.Size = new System.Drawing.Size(343, 21); this.TaskActionComboBox.TabIndex = 1; this.TaskActionComboBox.SelectedIndexChanged += new System.EventHandler(this.TaskActionComboBox_SelectedIndexChanged); // // TaskKBDPanel // - this.TaskKBDPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.TaskKBDPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.TaskKBDPanel.Controls.Add(this.TaskKBDTextPanel); this.TaskKBDPanel.Controls.Add(this.TaskKBDSettingsPanel); this.TaskKBDPanel.Controls.Add(this.TaskKBDShortcutPanel); this.TaskKBDPanel.Enabled = false; - this.TaskKBDPanel.Location = new System.Drawing.Point(0, 50); + this.TaskKBDPanel.Location = new System.Drawing.Point(0, 40); this.TaskKBDPanel.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDPanel.Name = "TaskKBDPanel"; - this.TaskKBDPanel.Size = new System.Drawing.Size(499, 336); + this.TaskKBDPanel.Size = new System.Drawing.Size(399, 269); this.TaskKBDPanel.TabIndex = 3; this.TaskKBDPanel.Visible = false; // // TaskKBDTextPanel // - this.TaskKBDTextPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.TaskKBDTextPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.TaskKBDTextPanel.Controls.Add(this.TaskKBDSwitchAHKButton); this.TaskKBDTextPanel.Controls.Add(this.TaskKBDHelpButton2); this.TaskKBDTextPanel.Controls.Add(this.TaskKBDTextBox); @@ -489,16 +502,15 @@ private void InitializeComponent() this.TaskKBDTextPanel.Location = new System.Drawing.Point(0, 0); this.TaskKBDTextPanel.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDTextPanel.Name = "TaskKBDTextPanel"; - this.TaskKBDTextPanel.Size = new System.Drawing.Size(499, 276); + this.TaskKBDTextPanel.Size = new System.Drawing.Size(399, 221); this.TaskKBDTextPanel.TabIndex = 1; // // TaskKBDSwitchAHKButton // this.TaskKBDSwitchAHKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.TaskKBDSwitchAHKButton.Location = new System.Drawing.Point(10, 241); - this.TaskKBDSwitchAHKButton.Margin = new System.Windows.Forms.Padding(4); + this.TaskKBDSwitchAHKButton.Location = new System.Drawing.Point(8, 193); this.TaskKBDSwitchAHKButton.Name = "TaskKBDSwitchAHKButton"; - this.TaskKBDSwitchAHKButton.Size = new System.Drawing.Size(219, 29); + this.TaskKBDSwitchAHKButton.Size = new System.Drawing.Size(175, 23); this.TaskKBDSwitchAHKButton.TabIndex = 2; this.TaskKBDSwitchAHKButton.Text = "Write AutoHotKey Script"; this.TaskKBDSwitchAHKButton.UseVisualStyleBackColor = true; @@ -507,10 +519,10 @@ private void InitializeComponent() // TaskKBDHelpButton2 // this.TaskKBDHelpButton2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.TaskKBDHelpButton2.Location = new System.Drawing.Point(394, 241); + this.TaskKBDHelpButton2.Location = new System.Drawing.Point(315, 193); this.TaskKBDHelpButton2.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDHelpButton2.Name = "TaskKBDHelpButton2"; - this.TaskKBDHelpButton2.Size = new System.Drawing.Size(94, 29); + this.TaskKBDHelpButton2.Size = new System.Drawing.Size(75, 23); this.TaskKBDHelpButton2.TabIndex = 3; this.TaskKBDHelpButton2.Text = "Help"; this.TaskKBDHelpButton2.UseVisualStyleBackColor = true; @@ -518,15 +530,15 @@ private void InitializeComponent() // // TaskKBDTextBox // - this.TaskKBDTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TaskKBDTextBox.Location = new System.Drawing.Point(10, 28); + this.TaskKBDTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TaskKBDTextBox.Location = new System.Drawing.Point(8, 22); this.TaskKBDTextBox.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDTextBox.Multiline = true; this.TaskKBDTextBox.Name = "TaskKBDTextBox"; this.TaskKBDTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.TaskKBDTextBox.Size = new System.Drawing.Size(476, 208); + this.TaskKBDTextBox.Size = new System.Drawing.Size(382, 167); this.TaskKBDTextBox.TabIndex = 1; this.TaskKBDTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Text_SelectAll); this.TaskKBDTextBox.Leave += new System.EventHandler(this.TaskKBDTextBox_Leave); @@ -535,17 +547,17 @@ private void InitializeComponent() // this.TaskKBDLabel.AutoSize = true; this.TaskKBDLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.TaskKBDLabel.Location = new System.Drawing.Point(8, 5); + this.TaskKBDLabel.Location = new System.Drawing.Point(6, 4); this.TaskKBDLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.TaskKBDLabel.Name = "TaskKBDLabel"; - this.TaskKBDLabel.Size = new System.Drawing.Size(311, 17); + this.TaskKBDLabel.Size = new System.Drawing.Size(244, 13); this.TaskKBDLabel.TabIndex = 0; this.TaskKBDLabel.Text = "Type plain keyboar&d text as it will appear:"; // // TaskKBDSettingsPanel // - this.TaskKBDSettingsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.TaskKBDSettingsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.TaskKBDSettingsPanel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.TaskKBDSettingsPanel.BackColor = System.Drawing.Color.Transparent; this.TaskKBDSettingsPanel.Controls.Add(this.TaskKBDMinimizeAfterwardCheckBox); @@ -555,19 +567,43 @@ private void InitializeComponent() this.TaskKBDSettingsPanel.Controls.Add(this.TaskKBDNewCheckBox); this.TaskKBDSettingsPanel.Controls.Add(this.TaskKBDSwitchTextButton); this.TaskKBDSettingsPanel.Controls.Add(this.TaskKBDSwitchShortcutButton); - this.TaskKBDSettingsPanel.Location = new System.Drawing.Point(0, 279); + this.TaskKBDSettingsPanel.Location = new System.Drawing.Point(0, 223); this.TaskKBDSettingsPanel.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDSettingsPanel.Name = "TaskKBDSettingsPanel"; - this.TaskKBDSettingsPanel.Size = new System.Drawing.Size(502, 78); + this.TaskKBDSettingsPanel.Size = new System.Drawing.Size(402, 62); this.TaskKBDSettingsPanel.TabIndex = 9; // + // TaskKBDMinimizeAfterwardCheckBox + // + this.TaskKBDMinimizeAfterwardCheckBox.AutoSize = true; + this.TaskKBDMinimizeAfterwardCheckBox.Location = new System.Drawing.Point(136, 24); + this.TaskKBDMinimizeAfterwardCheckBox.Margin = new System.Windows.Forms.Padding(2); + this.TaskKBDMinimizeAfterwardCheckBox.Name = "TaskKBDMinimizeAfterwardCheckBox"; + this.TaskKBDMinimizeAfterwardCheckBox.Size = new System.Drawing.Size(121, 17); + this.TaskKBDMinimizeAfterwardCheckBox.TabIndex = 8; + this.TaskKBDMinimizeAfterwardCheckBox.Text = "Minimize/deactivate"; + this.TaskKBDMinimizeAfterwardCheckBox.UseVisualStyleBackColor = true; + this.TaskKBDMinimizeAfterwardCheckBox.CheckedChanged += new System.EventHandler(this.TaskKBDMinimizeAfterwardCheckBox_CheckedChanged); + // + // TaskKBDSendInBackgroundCheckBox + // + this.TaskKBDSendInBackgroundCheckBox.AutoSize = true; + this.TaskKBDSendInBackgroundCheckBox.Location = new System.Drawing.Point(266, 24); + this.TaskKBDSendInBackgroundCheckBox.Margin = new System.Windows.Forms.Padding(2); + this.TaskKBDSendInBackgroundCheckBox.Name = "TaskKBDSendInBackgroundCheckBox"; + this.TaskKBDSendInBackgroundCheckBox.Size = new System.Drawing.Size(122, 17); + this.TaskKBDSendInBackgroundCheckBox.TabIndex = 7; + this.TaskKBDSendInBackgroundCheckBox.Text = "Send in background"; + this.TaskKBDSendInBackgroundCheckBox.UseVisualStyleBackColor = true; + this.TaskKBDSendInBackgroundCheckBox.CheckedChanged += new System.EventHandler(this.TaskKBDSendInBackground_CheckedChanged); + // // TaskKBDIgnoreCurrentCheckBox // this.TaskKBDIgnoreCurrentCheckBox.AutoSize = true; - this.TaskKBDIgnoreCurrentCheckBox.Location = new System.Drawing.Point(10, 5); + this.TaskKBDIgnoreCurrentCheckBox.Location = new System.Drawing.Point(8, 4); this.TaskKBDIgnoreCurrentCheckBox.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDIgnoreCurrentCheckBox.Name = "TaskKBDIgnoreCurrentCheckBox"; - this.TaskKBDIgnoreCurrentCheckBox.Size = new System.Drawing.Size(133, 21); + this.TaskKBDIgnoreCurrentCheckBox.Size = new System.Drawing.Size(102, 17); this.TaskKBDIgnoreCurrentCheckBox.TabIndex = 6; this.TaskKBDIgnoreCurrentCheckBox.Text = "Ignore if running"; this.TaskKBDIgnoreCurrentCheckBox.UseVisualStyleBackColor = true; @@ -576,10 +612,10 @@ private void InitializeComponent() // TaskKBDIgnoreAbsentCheckBox // this.TaskKBDIgnoreAbsentCheckBox.AutoSize = true; - this.TaskKBDIgnoreAbsentCheckBox.Location = new System.Drawing.Point(10, 30); + this.TaskKBDIgnoreAbsentCheckBox.Location = new System.Drawing.Point(8, 24); this.TaskKBDIgnoreAbsentCheckBox.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDIgnoreAbsentCheckBox.Name = "TaskKBDIgnoreAbsentCheckBox"; - this.TaskKBDIgnoreAbsentCheckBox.Size = new System.Drawing.Size(157, 21); + this.TaskKBDIgnoreAbsentCheckBox.Size = new System.Drawing.Size(120, 17); this.TaskKBDIgnoreAbsentCheckBox.TabIndex = 5; this.TaskKBDIgnoreAbsentCheckBox.Text = "Ignore if not running"; this.TaskKBDIgnoreAbsentCheckBox.UseVisualStyleBackColor = true; @@ -587,13 +623,13 @@ private void InitializeComponent() // // TaskKBDNewCheckBox // - this.TaskKBDNewCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.TaskKBDNewCheckBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.TaskKBDNewCheckBox.CheckAlign = System.Drawing.ContentAlignment.TopLeft; - this.TaskKBDNewCheckBox.Location = new System.Drawing.Point(153, 5); + this.TaskKBDNewCheckBox.Location = new System.Drawing.Point(122, 4); this.TaskKBDNewCheckBox.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDNewCheckBox.Name = "TaskKBDNewCheckBox"; - this.TaskKBDNewCheckBox.Size = new System.Drawing.Size(144, 21); + this.TaskKBDNewCheckBox.Size = new System.Drawing.Size(115, 17); this.TaskKBDNewCheckBox.TabIndex = 0; this.TaskKBDNewCheckBox.Text = "Open new window"; this.TaskKBDNewCheckBox.TextAlign = System.Drawing.ContentAlignment.TopLeft; @@ -604,10 +640,10 @@ private void InitializeComponent() // this.TaskKBDSwitchTextButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.TaskKBDSwitchTextButton.BackColor = System.Drawing.SystemColors.Control; - this.TaskKBDSwitchTextButton.Location = new System.Drawing.Point(312, 0); + this.TaskKBDSwitchTextButton.Location = new System.Drawing.Point(250, 0); this.TaskKBDSwitchTextButton.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDSwitchTextButton.Name = "TaskKBDSwitchTextButton"; - this.TaskKBDSwitchTextButton.Size = new System.Drawing.Size(179, 29); + this.TaskKBDSwitchTextButton.Size = new System.Drawing.Size(143, 23); this.TaskKBDSwitchTextButton.TabIndex = 4; this.TaskKBDSwitchTextButton.Text = "Switch to Text Mode"; this.TaskKBDSwitchTextButton.UseVisualStyleBackColor = true; @@ -617,10 +653,10 @@ private void InitializeComponent() // this.TaskKBDSwitchShortcutButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.TaskKBDSwitchShortcutButton.BackColor = System.Drawing.SystemColors.Control; - this.TaskKBDSwitchShortcutButton.Location = new System.Drawing.Point(301, 0); + this.TaskKBDSwitchShortcutButton.Location = new System.Drawing.Point(241, 0); this.TaskKBDSwitchShortcutButton.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDSwitchShortcutButton.Name = "TaskKBDSwitchShortcutButton"; - this.TaskKBDSwitchShortcutButton.Size = new System.Drawing.Size(190, 29); + this.TaskKBDSwitchShortcutButton.Size = new System.Drawing.Size(152, 23); this.TaskKBDSwitchShortcutButton.TabIndex = 3; this.TaskKBDSwitchShortcutButton.Text = "Switch to Shortcut Mode"; this.TaskKBDSwitchShortcutButton.UseVisualStyleBackColor = true; @@ -628,8 +664,8 @@ private void InitializeComponent() // // TaskKBDShortcutPanel // - this.TaskKBDShortcutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.TaskKBDShortcutPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.TaskKBDShortcutPanel.Controls.Add(this.TaskKBDShortcutClearButton); this.TaskKBDShortcutPanel.Controls.Add(this.TaskKBDKeyboardTextBox); this.TaskKBDShortcutPanel.Controls.Add(this.TaskKBDShortcutLabel); @@ -637,15 +673,15 @@ private void InitializeComponent() this.TaskKBDShortcutPanel.Location = new System.Drawing.Point(0, 0); this.TaskKBDShortcutPanel.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDShortcutPanel.Name = "TaskKBDShortcutPanel"; - this.TaskKBDShortcutPanel.Size = new System.Drawing.Size(499, 90); + this.TaskKBDShortcutPanel.Size = new System.Drawing.Size(399, 72); this.TaskKBDShortcutPanel.TabIndex = 0; // // TaskKBDShortcutClearButton // - this.TaskKBDShortcutClearButton.Location = new System.Drawing.Point(9, 60); + this.TaskKBDShortcutClearButton.Location = new System.Drawing.Point(7, 48); this.TaskKBDShortcutClearButton.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDShortcutClearButton.Name = "TaskKBDShortcutClearButton"; - this.TaskKBDShortcutClearButton.Size = new System.Drawing.Size(80, 29); + this.TaskKBDShortcutClearButton.Size = new System.Drawing.Size(64, 23); this.TaskKBDShortcutClearButton.TabIndex = 2; this.TaskKBDShortcutClearButton.Text = "Clear"; this.TaskKBDShortcutClearButton.UseVisualStyleBackColor = true; @@ -653,13 +689,13 @@ private void InitializeComponent() // // TaskKBDKeyboardTextBox // - this.TaskKBDKeyboardTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.TaskKBDKeyboardTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.TaskKBDKeyboardTextBox.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.TaskKBDKeyboardTextBox.Location = new System.Drawing.Point(10, 28); + this.TaskKBDKeyboardTextBox.Location = new System.Drawing.Point(8, 22); this.TaskKBDKeyboardTextBox.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDKeyboardTextBox.Name = "TaskKBDKeyboardTextBox"; - this.TaskKBDKeyboardTextBox.Size = new System.Drawing.Size(476, 27); + this.TaskKBDKeyboardTextBox.Size = new System.Drawing.Size(382, 23); this.TaskKBDKeyboardTextBox.TabIndex = 1; this.TaskKBDKeyboardTextBox.Leave += new System.EventHandler(this.TaskKBDKeyboardTextBox_Leave); // @@ -667,20 +703,20 @@ private void InitializeComponent() // this.TaskKBDShortcutLabel.AutoSize = true; this.TaskKBDShortcutLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.TaskKBDShortcutLabel.Location = new System.Drawing.Point(6, 5); + this.TaskKBDShortcutLabel.Location = new System.Drawing.Point(5, 4); this.TaskKBDShortcutLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.TaskKBDShortcutLabel.Name = "TaskKBDShortcutLabel"; - this.TaskKBDShortcutLabel.Size = new System.Drawing.Size(388, 17); + this.TaskKBDShortcutLabel.Size = new System.Drawing.Size(301, 13); this.TaskKBDShortcutLabel.TabIndex = 0; this.TaskKBDShortcutLabel.Text = "Press keyboar&d shortcuts to be sent to the program:"; // // TaskKBDHelpButton // this.TaskKBDHelpButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.TaskKBDHelpButton.Location = new System.Drawing.Point(394, 60); + this.TaskKBDHelpButton.Location = new System.Drawing.Point(315, 48); this.TaskKBDHelpButton.Margin = new System.Windows.Forms.Padding(2); this.TaskKBDHelpButton.Name = "TaskKBDHelpButton"; - this.TaskKBDHelpButton.Size = new System.Drawing.Size(94, 29); + this.TaskKBDHelpButton.Size = new System.Drawing.Size(75, 23); this.TaskKBDHelpButton.TabIndex = 3; this.TaskKBDHelpButton.Text = "Help"; this.TaskKBDHelpButton.UseVisualStyleBackColor = true; @@ -688,29 +724,29 @@ private void InitializeComponent() // // TaskCMDPanel // - this.TaskCMDPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.TaskCMDPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.TaskCMDPanel.Controls.Add(this.TaskCMDHelpButton); this.TaskCMDPanel.Controls.Add(this.TaskCMDBrowseButton); this.TaskCMDPanel.Controls.Add(this.TaskCMDShowWindowCheckbox); this.TaskCMDPanel.Controls.Add(this.TaskCMDTextBox); this.TaskCMDPanel.Controls.Add(this.TaskCMDLabel); this.TaskCMDPanel.Enabled = false; - this.TaskCMDPanel.Location = new System.Drawing.Point(0, 50); + this.TaskCMDPanel.Location = new System.Drawing.Point(0, 40); this.TaskCMDPanel.Margin = new System.Windows.Forms.Padding(2); this.TaskCMDPanel.Name = "TaskCMDPanel"; - this.TaskCMDPanel.Size = new System.Drawing.Size(499, 336); + this.TaskCMDPanel.Size = new System.Drawing.Size(399, 269); this.TaskCMDPanel.TabIndex = 1; this.TaskCMDPanel.Visible = false; // // TaskCMDHelpButton // this.TaskCMDHelpButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.TaskCMDHelpButton.Location = new System.Drawing.Point(394, 59); + this.TaskCMDHelpButton.Location = new System.Drawing.Point(315, 47); this.TaskCMDHelpButton.Margin = new System.Windows.Forms.Padding(2); this.TaskCMDHelpButton.Name = "TaskCMDHelpButton"; - this.TaskCMDHelpButton.Size = new System.Drawing.Size(94, 29); + this.TaskCMDHelpButton.Size = new System.Drawing.Size(75, 23); this.TaskCMDHelpButton.TabIndex = 4; this.TaskCMDHelpButton.Text = "Help"; this.TaskCMDHelpButton.UseVisualStyleBackColor = true; @@ -719,10 +755,10 @@ private void InitializeComponent() // TaskCMDBrowseButton // this.TaskCMDBrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.TaskCMDBrowseButton.Location = new System.Drawing.Point(394, 25); + this.TaskCMDBrowseButton.Location = new System.Drawing.Point(315, 20); this.TaskCMDBrowseButton.Margin = new System.Windows.Forms.Padding(2); this.TaskCMDBrowseButton.Name = "TaskCMDBrowseButton"; - this.TaskCMDBrowseButton.Size = new System.Drawing.Size(94, 29); + this.TaskCMDBrowseButton.Size = new System.Drawing.Size(75, 23); this.TaskCMDBrowseButton.TabIndex = 2; this.TaskCMDBrowseButton.Text = "Browse"; this.TaskCMDBrowseButton.UseVisualStyleBackColor = true; @@ -731,10 +767,10 @@ private void InitializeComponent() // TaskCMDShowWindowCheckbox // this.TaskCMDShowWindowCheckbox.AutoSize = true; - this.TaskCMDShowWindowCheckbox.Location = new System.Drawing.Point(38, 62); + this.TaskCMDShowWindowCheckbox.Location = new System.Drawing.Point(30, 50); this.TaskCMDShowWindowCheckbox.Margin = new System.Windows.Forms.Padding(2); this.TaskCMDShowWindowCheckbox.Name = "TaskCMDShowWindowCheckbox"; - this.TaskCMDShowWindowCheckbox.Size = new System.Drawing.Size(222, 21); + this.TaskCMDShowWindowCheckbox.Size = new System.Drawing.Size(172, 17); this.TaskCMDShowWindowCheckbox.TabIndex = 3; this.TaskCMDShowWindowCheckbox.Text = "Run in Command Line Window"; this.TaskCMDShowWindowCheckbox.UseVisualStyleBackColor = true; @@ -742,12 +778,12 @@ private void InitializeComponent() // // TaskCMDTextBox // - this.TaskCMDTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.TaskCMDTextBox.Location = new System.Drawing.Point(9, 26); + this.TaskCMDTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.TaskCMDTextBox.Location = new System.Drawing.Point(7, 21); this.TaskCMDTextBox.Margin = new System.Windows.Forms.Padding(2); this.TaskCMDTextBox.Name = "TaskCMDTextBox"; - this.TaskCMDTextBox.Size = new System.Drawing.Size(379, 22); + this.TaskCMDTextBox.Size = new System.Drawing.Size(304, 20); this.TaskCMDTextBox.TabIndex = 1; this.TaskCMDTextBox.Leave += new System.EventHandler(this.TaskCMDTextBox_Leave); // @@ -755,18 +791,18 @@ private void InitializeComponent() // this.TaskCMDLabel.AutoSize = true; this.TaskCMDLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.TaskCMDLabel.Location = new System.Drawing.Point(6, 4); + this.TaskCMDLabel.Location = new System.Drawing.Point(5, 3); this.TaskCMDLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.TaskCMDLabel.Name = "TaskCMDLabel"; - this.TaskCMDLabel.Size = new System.Drawing.Size(119, 17); + this.TaskCMDLabel.Size = new System.Drawing.Size(93, 13); this.TaskCMDLabel.TabIndex = 0; this.TaskCMDLabel.Text = "Comman&d Line:"; // // TaskAHKPanel // - this.TaskAHKPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.TaskAHKPanel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.TaskAHKPanel.BackColor = System.Drawing.Color.Transparent; this.TaskAHKPanel.Controls.Add(this.TaskAHKHelpButton); this.TaskAHKPanel.Controls.Add(this.TaskAHKSaveCopyButton); @@ -774,20 +810,20 @@ private void InitializeComponent() this.TaskAHKPanel.Controls.Add(this.TaskAHKTextBox); this.TaskAHKPanel.Controls.Add(this.TaskAHKLabel); this.TaskAHKPanel.Enabled = false; - this.TaskAHKPanel.Location = new System.Drawing.Point(0, 50); + this.TaskAHKPanel.Location = new System.Drawing.Point(0, 40); this.TaskAHKPanel.Margin = new System.Windows.Forms.Padding(2); this.TaskAHKPanel.Name = "TaskAHKPanel"; - this.TaskAHKPanel.Size = new System.Drawing.Size(499, 336); + this.TaskAHKPanel.Size = new System.Drawing.Size(399, 269); this.TaskAHKPanel.TabIndex = 2; this.TaskAHKPanel.Visible = false; // // TaskAHKHelpButton // this.TaskAHKHelpButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); - this.TaskAHKHelpButton.Location = new System.Drawing.Point(9, 299); + this.TaskAHKHelpButton.Location = new System.Drawing.Point(7, 239); this.TaskAHKHelpButton.Margin = new System.Windows.Forms.Padding(2); this.TaskAHKHelpButton.Name = "TaskAHKHelpButton"; - this.TaskAHKHelpButton.Size = new System.Drawing.Size(94, 29); + this.TaskAHKHelpButton.Size = new System.Drawing.Size(75, 23); this.TaskAHKHelpButton.TabIndex = 2; this.TaskAHKHelpButton.Text = "Help"; this.TaskAHKHelpButton.UseVisualStyleBackColor = true; @@ -796,10 +832,10 @@ private void InitializeComponent() // TaskAHKSaveCopyButton // this.TaskAHKSaveCopyButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.TaskAHKSaveCopyButton.Location = new System.Drawing.Point(170, 299); + this.TaskAHKSaveCopyButton.Location = new System.Drawing.Point(136, 239); this.TaskAHKSaveCopyButton.Margin = new System.Windows.Forms.Padding(2); this.TaskAHKSaveCopyButton.Name = "TaskAHKSaveCopyButton"; - this.TaskAHKSaveCopyButton.Size = new System.Drawing.Size(150, 29); + this.TaskAHKSaveCopyButton.Size = new System.Drawing.Size(120, 23); this.TaskAHKSaveCopyButton.TabIndex = 3; this.TaskAHKSaveCopyButton.Text = "Save Copy As..."; this.TaskAHKSaveCopyButton.UseVisualStyleBackColor = true; @@ -808,10 +844,10 @@ private void InitializeComponent() // TaskAHKOpenExternalButton // this.TaskAHKOpenExternalButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.TaskAHKOpenExternalButton.Location = new System.Drawing.Point(325, 299); + this.TaskAHKOpenExternalButton.Location = new System.Drawing.Point(260, 239); this.TaskAHKOpenExternalButton.Margin = new System.Windows.Forms.Padding(2); this.TaskAHKOpenExternalButton.Name = "TaskAHKOpenExternalButton"; - this.TaskAHKOpenExternalButton.Size = new System.Drawing.Size(162, 29); + this.TaskAHKOpenExternalButton.Size = new System.Drawing.Size(130, 23); this.TaskAHKOpenExternalButton.TabIndex = 4; this.TaskAHKOpenExternalButton.Text = "Copy to Clipboard"; this.TaskAHKOpenExternalButton.UseVisualStyleBackColor = true; @@ -821,16 +857,16 @@ private void InitializeComponent() // this.TaskAHKTextBox.AcceptsReturn = true; this.TaskAHKTextBox.AcceptsTab = true; - this.TaskAHKTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.TaskAHKTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.TaskAHKTextBox.Font = new System.Drawing.Font("Lucida Console", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.TaskAHKTextBox.Location = new System.Drawing.Point(6, 28); + this.TaskAHKTextBox.Location = new System.Drawing.Point(5, 22); this.TaskAHKTextBox.Margin = new System.Windows.Forms.Padding(2); this.TaskAHKTextBox.Multiline = true; this.TaskAHKTextBox.Name = "TaskAHKTextBox"; this.TaskAHKTextBox.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.TaskAHKTextBox.Size = new System.Drawing.Size(480, 265); + this.TaskAHKTextBox.Size = new System.Drawing.Size(385, 213); this.TaskAHKTextBox.TabIndex = 1; this.TaskAHKTextBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.Text_SelectAll); this.TaskAHKTextBox.Leave += new System.EventHandler(this.TaskAHKTextBox_Leave); @@ -839,18 +875,18 @@ private void InitializeComponent() // this.TaskAHKLabel.AutoSize = true; this.TaskAHKLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.TaskAHKLabel.Location = new System.Drawing.Point(8, 5); + this.TaskAHKLabel.Location = new System.Drawing.Point(6, 4); this.TaskAHKLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.TaskAHKLabel.Name = "TaskAHKLabel"; - this.TaskAHKLabel.Size = new System.Drawing.Size(220, 17); + this.TaskAHKLabel.Size = new System.Drawing.Size(173, 13); this.TaskAHKLabel.TabIndex = 0; this.TaskAHKLabel.Text = "AutoHotKey Comman&d Script:"; // // FileGroupBox // - this.FileGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.FileGroupBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.FileGroupBox.Controls.Add(this.FileOpenApp); this.FileGroupBox.Controls.Add(this.FileOpenDefault); this.FileGroupBox.Controls.Add(this.FileBrowseButton); @@ -862,7 +898,7 @@ private void InitializeComponent() this.FileGroupBox.Margin = new System.Windows.Forms.Padding(2); this.FileGroupBox.Name = "FileGroupBox"; this.FileGroupBox.Padding = new System.Windows.Forms.Padding(2); - this.FileGroupBox.Size = new System.Drawing.Size(500, 408); + this.FileGroupBox.Size = new System.Drawing.Size(400, 326); this.FileGroupBox.TabIndex = 4; this.FileGroupBox.TabStop = false; this.FileGroupBox.Text = "File/Folder Shortcut Settings"; @@ -871,10 +907,10 @@ private void InitializeComponent() // FileOpenApp // this.FileOpenApp.AutoSize = true; - this.FileOpenApp.Location = new System.Drawing.Point(38, 140); + this.FileOpenApp.Location = new System.Drawing.Point(30, 112); this.FileOpenApp.Margin = new System.Windows.Forms.Padding(2); this.FileOpenApp.Name = "FileOpenApp"; - this.FileOpenApp.Size = new System.Drawing.Size(193, 21); + this.FileOpenApp.Size = new System.Drawing.Size(149, 17); this.FileOpenApp.TabIndex = 5; this.FileOpenApp.Text = "Open the shortcut with {0}"; this.FileOpenApp.UseVisualStyleBackColor = true; @@ -884,10 +920,10 @@ private void InitializeComponent() // this.FileOpenDefault.AutoSize = true; this.FileOpenDefault.Checked = true; - this.FileOpenDefault.Location = new System.Drawing.Point(38, 112); + this.FileOpenDefault.Location = new System.Drawing.Point(30, 90); this.FileOpenDefault.Margin = new System.Windows.Forms.Padding(2); this.FileOpenDefault.Name = "FileOpenDefault"; - this.FileOpenDefault.Size = new System.Drawing.Size(293, 21); + this.FileOpenDefault.Size = new System.Drawing.Size(221, 17); this.FileOpenDefault.TabIndex = 4; this.FileOpenDefault.TabStop = true; this.FileOpenDefault.Text = "Open the shortcut with its default program"; @@ -896,10 +932,10 @@ private void InitializeComponent() // FileBrowseButton // this.FileBrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.FileBrowseButton.Location = new System.Drawing.Point(361, 75); + this.FileBrowseButton.Location = new System.Drawing.Point(289, 60); this.FileBrowseButton.Margin = new System.Windows.Forms.Padding(2); this.FileBrowseButton.Name = "FileBrowseButton"; - this.FileBrowseButton.Size = new System.Drawing.Size(128, 29); + this.FileBrowseButton.Size = new System.Drawing.Size(102, 23); this.FileBrowseButton.TabIndex = 3; this.FileBrowseButton.Text = "Browse File"; this.FileBrowseButton.UseVisualStyleBackColor = true; @@ -908,10 +944,10 @@ private void InitializeComponent() // FolderBrowseButton // this.FolderBrowseButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.FolderBrowseButton.Location = new System.Drawing.Point(188, 75); + this.FolderBrowseButton.Location = new System.Drawing.Point(150, 60); this.FolderBrowseButton.Margin = new System.Windows.Forms.Padding(2); this.FolderBrowseButton.Name = "FolderBrowseButton"; - this.FolderBrowseButton.Size = new System.Drawing.Size(169, 29); + this.FolderBrowseButton.Size = new System.Drawing.Size(135, 23); this.FolderBrowseButton.TabIndex = 2; this.FolderBrowseButton.Text = "Browse Folder"; this.FolderBrowseButton.UseVisualStyleBackColor = true; @@ -919,29 +955,29 @@ private void InitializeComponent() // // FileTextBox // - this.FileTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.FileTextBox.Location = new System.Drawing.Point(9, 44); + this.FileTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.FileTextBox.Location = new System.Drawing.Point(7, 35); this.FileTextBox.Margin = new System.Windows.Forms.Padding(2); this.FileTextBox.Name = "FileTextBox"; - this.FileTextBox.Size = new System.Drawing.Size(478, 22); + this.FileTextBox.Size = new System.Drawing.Size(383, 20); this.FileTextBox.TabIndex = 1; this.FileTextBox.Leave += new System.EventHandler(this.FileTextBox_Leave); // // FileLabel // this.FileLabel.AutoSize = true; - this.FileLabel.Location = new System.Drawing.Point(6, 22); + this.FileLabel.Location = new System.Drawing.Point(5, 18); this.FileLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.FileLabel.Name = "FileLabel"; - this.FileLabel.Size = new System.Drawing.Size(66, 17); + this.FileLabel.Size = new System.Drawing.Size(51, 13); this.FileLabel.TabIndex = 0; this.FileLabel.Text = "&Location:"; // // ItemPanel // - this.ItemPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.ItemPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.ItemPanel.Controls.Add(this.ItemIconPictureBox); this.ItemPanel.Controls.Add(this.ItemIconComboBox); this.ItemPanel.Controls.Add(this.ItemTypeComboBox); @@ -951,27 +987,27 @@ private void InitializeComponent() this.ItemPanel.Controls.Add(this.ItemNameTextBox); this.ItemPanel.Controls.Add(this.ItemNameLabel); this.ItemPanel.Enabled = false; - this.ItemPanel.Location = new System.Drawing.Point(309, 8); + this.ItemPanel.Location = new System.Drawing.Point(247, 6); this.ItemPanel.Margin = new System.Windows.Forms.Padding(2); this.ItemPanel.Name = "ItemPanel"; - this.ItemPanel.Size = new System.Drawing.Size(500, 100); + this.ItemPanel.Size = new System.Drawing.Size(400, 80); this.ItemPanel.TabIndex = 2; // // ItemIconPictureBox // this.ItemIconPictureBox.BackColor = System.Drawing.Color.Transparent; - this.ItemIconPictureBox.Location = new System.Drawing.Point(59, 39); + this.ItemIconPictureBox.Location = new System.Drawing.Point(47, 31); this.ItemIconPictureBox.Margin = new System.Windows.Forms.Padding(0); this.ItemIconPictureBox.Name = "ItemIconPictureBox"; - this.ItemIconPictureBox.Size = new System.Drawing.Size(20, 20); + this.ItemIconPictureBox.Size = new System.Drawing.Size(16, 16); this.ItemIconPictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; this.ItemIconPictureBox.TabIndex = 20; this.ItemIconPictureBox.TabStop = false; // // ItemIconComboBox // - this.ItemIconComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.ItemIconComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.ItemIconComboBox.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawVariable; this.ItemIconComboBox.DropDownHeight = 212; this.ItemIconComboBox.ImageList = null; @@ -1000,18 +1036,18 @@ private void InitializeComponent() imageComboBoxItem1, imageComboBoxItem2, imageComboBoxItem3}); - this.ItemIconComboBox.Location = new System.Drawing.Point(81, 36); + this.ItemIconComboBox.Location = new System.Drawing.Point(65, 29); this.ItemIconComboBox.Margin = new System.Windows.Forms.Padding(2); this.ItemIconComboBox.Name = "ItemIconComboBox"; - this.ItemIconComboBox.Size = new System.Drawing.Size(308, 21); + this.ItemIconComboBox.Size = new System.Drawing.Size(247, 21); this.ItemIconComboBox.TabIndex = 3; this.ItemIconComboBox.SelectedIndexChanged += new System.EventHandler(this.ItemIconComboBox_SelectedIndexChanged); this.ItemIconComboBox.Leave += new System.EventHandler(this.ItemIconComboBox_Leave); // // ItemTypeComboBox // - this.ItemTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.ItemTypeComboBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.ItemTypeComboBox.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.ItemTypeComboBox.FormattingEnabled = true; this.ItemTypeComboBox.Items.AddRange(new object[] { @@ -1019,30 +1055,30 @@ private void InitializeComponent() "File/Folder Shortcut", "Category", "Separator"}); - this.ItemTypeComboBox.Location = new System.Drawing.Point(59, 68); + this.ItemTypeComboBox.Location = new System.Drawing.Point(47, 54); this.ItemTypeComboBox.Margin = new System.Windows.Forms.Padding(2); this.ItemTypeComboBox.Name = "ItemTypeComboBox"; - this.ItemTypeComboBox.Size = new System.Drawing.Size(429, 24); + this.ItemTypeComboBox.Size = new System.Drawing.Size(344, 21); this.ItemTypeComboBox.TabIndex = 6; this.ItemTypeComboBox.SelectedIndexChanged += new System.EventHandler(this.ItemTypeComboBox_SelectedIndexChanged); // // ItemTypeLabel // this.ItemTypeLabel.AutoSize = true; - this.ItemTypeLabel.Location = new System.Drawing.Point(8, 71); + this.ItemTypeLabel.Location = new System.Drawing.Point(6, 57); this.ItemTypeLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.ItemTypeLabel.Name = "ItemTypeLabel"; - this.ItemTypeLabel.Size = new System.Drawing.Size(44, 17); + this.ItemTypeLabel.Size = new System.Drawing.Size(34, 13); this.ItemTypeLabel.TabIndex = 5; this.ItemTypeLabel.Text = "&Type:"; // // IconButtonBrowse // this.IconButtonBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.IconButtonBrowse.Location = new System.Drawing.Point(395, 34); + this.IconButtonBrowse.Location = new System.Drawing.Point(316, 27); this.IconButtonBrowse.Margin = new System.Windows.Forms.Padding(2); this.IconButtonBrowse.Name = "IconButtonBrowse"; - this.IconButtonBrowse.Size = new System.Drawing.Size(94, 29); + this.IconButtonBrowse.Size = new System.Drawing.Size(75, 23); this.IconButtonBrowse.TabIndex = 4; this.IconButtonBrowse.Text = "Browse"; this.IconButtonBrowse.UseVisualStyleBackColor = true; @@ -1051,21 +1087,21 @@ private void InitializeComponent() // ItemIconLabel // this.ItemIconLabel.AutoSize = true; - this.ItemIconLabel.Location = new System.Drawing.Point(8, 40); + this.ItemIconLabel.Location = new System.Drawing.Point(6, 32); this.ItemIconLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.ItemIconLabel.Name = "ItemIconLabel"; - this.ItemIconLabel.Size = new System.Drawing.Size(38, 17); + this.ItemIconLabel.Size = new System.Drawing.Size(31, 13); this.ItemIconLabel.TabIndex = 2; this.ItemIconLabel.Text = "Ic&on:"; // // ItemNameTextBox // - this.ItemNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ItemNameTextBox.Location = new System.Drawing.Point(59, 4); + this.ItemNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.ItemNameTextBox.Location = new System.Drawing.Point(47, 3); this.ItemNameTextBox.Margin = new System.Windows.Forms.Padding(2); this.ItemNameTextBox.Name = "ItemNameTextBox"; - this.ItemNameTextBox.Size = new System.Drawing.Size(429, 22); + this.ItemNameTextBox.Size = new System.Drawing.Size(344, 20); this.ItemNameTextBox.TabIndex = 1; this.ItemNameTextBox.Enter += new System.EventHandler(this.ItemNameTextBox_Enter); this.ItemNameTextBox.Leave += new System.EventHandler(this.ItemNameTextBox_Leave); @@ -1073,47 +1109,47 @@ private void InitializeComponent() // ItemNameLabel // this.ItemNameLabel.AutoSize = true; - this.ItemNameLabel.Location = new System.Drawing.Point(8, 8); + this.ItemNameLabel.Location = new System.Drawing.Point(6, 6); this.ItemNameLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.ItemNameLabel.Name = "ItemNameLabel"; - this.ItemNameLabel.Size = new System.Drawing.Size(49, 17); + this.ItemNameLabel.Size = new System.Drawing.Size(38, 13); this.ItemNameLabel.TabIndex = 0; this.ItemNameLabel.Text = "&Name:"; // // JumplistPanel // - this.JumplistPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); + this.JumplistPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); this.JumplistPanel.Controls.Add(this.JumplistAddButton); this.JumplistPanel.Controls.Add(this.JumplistDownButton); this.JumplistPanel.Controls.Add(this.JumplistUpButton); this.JumplistPanel.Controls.Add(this.JumplistDeleteButton); this.JumplistPanel.Controls.Add(this.JumplistListBox); this.JumplistPanel.Enabled = false; - this.JumplistPanel.Location = new System.Drawing.Point(6, 32); + this.JumplistPanel.Location = new System.Drawing.Point(5, 26); this.JumplistPanel.Margin = new System.Windows.Forms.Padding(2); this.JumplistPanel.Name = "JumplistPanel"; - this.JumplistPanel.Size = new System.Drawing.Size(298, 470); + this.JumplistPanel.Size = new System.Drawing.Size(238, 376); this.JumplistPanel.TabIndex = 1; // // JumplistAddButton // this.JumplistAddButton.ContextMenuStrip = this.AddButtonContextMenuStrip; this.JumplistAddButton.Image = ((System.Drawing.Image)(resources.GetObject("JumplistAddButton.Image"))); - this.JumplistAddButton.Location = new System.Drawing.Point(254, 35); + this.JumplistAddButton.Location = new System.Drawing.Point(203, 28); this.JumplistAddButton.Margin = new System.Windows.Forms.Padding(2); this.JumplistAddButton.Name = "JumplistAddButton"; - this.JumplistAddButton.Size = new System.Drawing.Size(40, 40); + this.JumplistAddButton.Size = new System.Drawing.Size(32, 32); this.JumplistAddButton.TabIndex = 1; this.JumplistAddButton.UseVisualStyleBackColor = true; // // JumplistDownButton // this.JumplistDownButton.Image = ((System.Drawing.Image)(resources.GetObject("JumplistDownButton.Image"))); - this.JumplistDownButton.Location = new System.Drawing.Point(254, 228); + this.JumplistDownButton.Location = new System.Drawing.Point(203, 182); this.JumplistDownButton.Margin = new System.Windows.Forms.Padding(2); this.JumplistDownButton.Name = "JumplistDownButton"; - this.JumplistDownButton.Size = new System.Drawing.Size(40, 40); + this.JumplistDownButton.Size = new System.Drawing.Size(32, 32); this.JumplistDownButton.TabIndex = 4; this.JumplistDownButton.UseVisualStyleBackColor = true; this.JumplistDownButton.Click += new System.EventHandler(this.JumplistDownButton_Click); @@ -1121,10 +1157,10 @@ private void InitializeComponent() // JumplistUpButton // this.JumplistUpButton.Image = ((System.Drawing.Image)(resources.GetObject("JumplistUpButton.Image"))); - this.JumplistUpButton.Location = new System.Drawing.Point(254, 180); + this.JumplistUpButton.Location = new System.Drawing.Point(203, 144); this.JumplistUpButton.Margin = new System.Windows.Forms.Padding(2); this.JumplistUpButton.Name = "JumplistUpButton"; - this.JumplistUpButton.Size = new System.Drawing.Size(40, 40); + this.JumplistUpButton.Size = new System.Drawing.Size(32, 32); this.JumplistUpButton.TabIndex = 3; this.JumplistUpButton.UseVisualStyleBackColor = true; this.JumplistUpButton.Click += new System.EventHandler(this.JumplistUpButton_Click); @@ -1133,10 +1169,10 @@ private void InitializeComponent() // this.JumplistDeleteButton.ContextMenuStrip = this.DeleteButtonContextMenuStrip; this.JumplistDeleteButton.Image = ((System.Drawing.Image)(resources.GetObject("JumplistDeleteButton.Image"))); - this.JumplistDeleteButton.Location = new System.Drawing.Point(254, 82); + this.JumplistDeleteButton.Location = new System.Drawing.Point(203, 66); this.JumplistDeleteButton.Margin = new System.Windows.Forms.Padding(2); this.JumplistDeleteButton.Name = "JumplistDeleteButton"; - this.JumplistDeleteButton.Size = new System.Drawing.Size(40, 40); + this.JumplistDeleteButton.Size = new System.Drawing.Size(32, 32); this.JumplistDeleteButton.TabIndex = 2; this.JumplistDeleteButton.UseVisualStyleBackColor = true; // @@ -1145,25 +1181,24 @@ private void InitializeComponent() this.DeleteButtonContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.deleteToolStripMenuItem}); this.DeleteButtonContextMenuStrip.Name = "DeleteButtonContextMenuStrip"; - this.DeleteButtonContextMenuStrip.Size = new System.Drawing.Size(118, 26); + this.DeleteButtonContextMenuStrip.Size = new System.Drawing.Size(108, 26); // // deleteToolStripMenuItem // this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; - this.deleteToolStripMenuItem.Size = new System.Drawing.Size(117, 22); + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(107, 22); this.deleteToolStripMenuItem.Text = "Delete"; this.deleteToolStripMenuItem.Click += new System.EventHandler(this.JumplistDeleteButton_Click); // // JumplistListBox // - this.JumplistListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left))); + this.JumplistListBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); this.JumplistListBox.FormattingEnabled = true; - this.JumplistListBox.ItemHeight = 16; - this.JumplistListBox.Location = new System.Drawing.Point(0, 6); + this.JumplistListBox.Location = new System.Drawing.Point(0, 5); this.JumplistListBox.Margin = new System.Windows.Forms.Padding(2); this.JumplistListBox.Name = "JumplistListBox"; - this.JumplistListBox.Size = new System.Drawing.Size(250, 404); + this.JumplistListBox.Size = new System.Drawing.Size(201, 316); this.JumplistListBox.TabIndex = 0; this.JumplistListBox.SelectedIndexChanged += new System.EventHandler(this.JumplistListBox_SelectedIndexChanged); this.JumplistListBox.KeyDown += new System.Windows.Forms.KeyEventHandler(this.JumplistListBox_KeyDown); @@ -1171,10 +1206,10 @@ private void InitializeComponent() // JumplistEnableCheckBox // this.JumplistEnableCheckBox.AutoSize = true; - this.JumplistEnableCheckBox.Location = new System.Drawing.Point(9, 8); + this.JumplistEnableCheckBox.Location = new System.Drawing.Point(7, 6); this.JumplistEnableCheckBox.Margin = new System.Windows.Forms.Padding(2); this.JumplistEnableCheckBox.Name = "JumplistEnableCheckBox"; - this.JumplistEnableCheckBox.Size = new System.Drawing.Size(180, 21); + this.JumplistEnableCheckBox.Size = new System.Drawing.Size(137, 17); this.JumplistEnableCheckBox.TabIndex = 0; this.JumplistEnableCheckBox.Text = "Enable Custom Jumplist"; this.JumplistEnableCheckBox.UseVisualStyleBackColor = true; @@ -1183,34 +1218,34 @@ private void InitializeComponent() // // JumplistHelpText // - this.JumplistHelpText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.JumplistHelpText.Location = new System.Drawing.Point(309, 115); + this.JumplistHelpText.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.JumplistHelpText.Location = new System.Drawing.Point(247, 92); this.JumplistHelpText.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.JumplistHelpText.Name = "JumplistHelpText"; - this.JumplistHelpText.Size = new System.Drawing.Size(499, 388); + this.JumplistHelpText.Size = new System.Drawing.Size(399, 310); this.JumplistHelpText.TabIndex = 0; this.JumplistHelpText.Text = "Add or select jumplist items to the left.\r\nOptions will appear that allow you to " + - "customize the jumplist."; + "customize the jumplist."; this.JumplistHelpText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // TabProgramSettings // this.TabProgramSettings.Controls.Add(this.ProgramSettingsPanel); - this.TabProgramSettings.Location = new System.Drawing.Point(4, 25); + this.TabProgramSettings.Location = new System.Drawing.Point(4, 22); this.TabProgramSettings.Margin = new System.Windows.Forms.Padding(2); this.TabProgramSettings.Name = "TabProgramSettings"; this.TabProgramSettings.Padding = new System.Windows.Forms.Padding(2); - this.TabProgramSettings.Size = new System.Drawing.Size(812, 507); + this.TabProgramSettings.Size = new System.Drawing.Size(648, 403); this.TabProgramSettings.TabIndex = 1; this.TabProgramSettings.Text = "Program Settings"; this.TabProgramSettings.UseVisualStyleBackColor = true; // // ProgramSettingsPanel // - this.ProgramSettingsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.ProgramSettingsPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.ProgramSettingsPanel.Controls.Add(this.ProgramNewOKButton); this.ProgramSettingsPanel.Controls.Add(this.ProgramWindowClassButton); this.ProgramSettingsPanel.Controls.Add(this.ProgramWindowClassLabel); @@ -1222,16 +1257,16 @@ private void InitializeComponent() this.ProgramSettingsPanel.Location = new System.Drawing.Point(0, 0); this.ProgramSettingsPanel.Margin = new System.Windows.Forms.Padding(2); this.ProgramSettingsPanel.Name = "ProgramSettingsPanel"; - this.ProgramSettingsPanel.Size = new System.Drawing.Size(801, 202); + this.ProgramSettingsPanel.Size = new System.Drawing.Size(641, 162); this.ProgramSettingsPanel.TabIndex = 0; // // ProgramNewOKButton // this.ProgramNewOKButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); - this.ProgramNewOKButton.Location = new System.Drawing.Point(704, 144); + this.ProgramNewOKButton.Location = new System.Drawing.Point(563, 115); this.ProgramNewOKButton.Margin = new System.Windows.Forms.Padding(2); this.ProgramNewOKButton.Name = "ProgramNewOKButton"; - this.ProgramNewOKButton.Size = new System.Drawing.Size(94, 29); + this.ProgramNewOKButton.Size = new System.Drawing.Size(75, 23); this.ProgramNewOKButton.TabIndex = 7; this.ProgramNewOKButton.Text = "&OK"; this.ProgramNewOKButton.UseVisualStyleBackColor = true; @@ -1239,10 +1274,10 @@ private void InitializeComponent() // // ProgramWindowClassButton // - this.ProgramWindowClassButton.Location = new System.Drawing.Point(8, 144); + this.ProgramWindowClassButton.Location = new System.Drawing.Point(6, 115); this.ProgramWindowClassButton.Margin = new System.Windows.Forms.Padding(2); this.ProgramWindowClassButton.Name = "ProgramWindowClassButton"; - this.ProgramWindowClassButton.Size = new System.Drawing.Size(190, 29); + this.ProgramWindowClassButton.Size = new System.Drawing.Size(152, 23); this.ProgramWindowClassButton.TabIndex = 6; this.ProgramWindowClassButton.Text = "&Select Main Window"; this.ProgramWindowClassButton.UseVisualStyleBackColor = true; @@ -1251,10 +1286,10 @@ private void InitializeComponent() // ProgramWindowClassLabel // this.ProgramWindowClassLabel.AutoSize = true; - this.ProgramWindowClassLabel.Location = new System.Drawing.Point(8, 124); + this.ProgramWindowClassLabel.Location = new System.Drawing.Point(6, 99); this.ProgramWindowClassLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.ProgramWindowClassLabel.Name = "ProgramWindowClassLabel"; - this.ProgramWindowClassLabel.Size = new System.Drawing.Size(401, 17); + this.ProgramWindowClassLabel.Size = new System.Drawing.Size(302, 13); this.ProgramWindowClassLabel.TabIndex = 5; this.ProgramWindowClassLabel.Text = "Re-select the program window, if settings need to be changed:"; // @@ -1265,95 +1300,96 @@ private void InitializeComponent() this.ProgramSettingsLabel.Location = new System.Drawing.Point(2, 2); this.ProgramSettingsLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.ProgramSettingsLabel.Name = "ProgramSettingsLabel"; - this.ProgramSettingsLabel.Size = new System.Drawing.Size(398, 20); + this.ProgramSettingsLabel.Size = new System.Drawing.Size(342, 17); this.ProgramSettingsLabel.TabIndex = 0; this.ProgramSettingsLabel.Text = "Verify the settings below for the new program:"; // // ProgramPathTextBox // - this.ProgramPathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ProgramPathTextBox.Location = new System.Drawing.Point(8, 99); + this.ProgramPathTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.ProgramPathTextBox.Location = new System.Drawing.Point(6, 79); this.ProgramPathTextBox.Margin = new System.Windows.Forms.Padding(2); this.ProgramPathTextBox.Name = "ProgramPathTextBox"; - this.ProgramPathTextBox.Size = new System.Drawing.Size(790, 22); + this.ProgramPathTextBox.Size = new System.Drawing.Size(633, 20); this.ProgramPathTextBox.TabIndex = 4; this.ProgramPathTextBox.Validated += new System.EventHandler(this.ProgramPathTextBox_Leave); // // ProgramPathLabel // this.ProgramPathLabel.AutoSize = true; - this.ProgramPathLabel.Location = new System.Drawing.Point(8, 78); + this.ProgramPathLabel.Location = new System.Drawing.Point(6, 62); this.ProgramPathLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.ProgramPathLabel.Name = "ProgramPathLabel"; - this.ProgramPathLabel.Size = new System.Drawing.Size(124, 17); + this.ProgramPathLabel.Size = new System.Drawing.Size(93, 13); this.ProgramPathLabel.TabIndex = 3; this.ProgramPathLabel.Text = "Program &Location:"; // // ProgramNameTextBox // - this.ProgramNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.ProgramNameTextBox.Location = new System.Drawing.Point(8, 52); + this.ProgramNameTextBox.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.ProgramNameTextBox.Location = new System.Drawing.Point(6, 42); this.ProgramNameTextBox.Margin = new System.Windows.Forms.Padding(2); this.ProgramNameTextBox.Name = "ProgramNameTextBox"; - this.ProgramNameTextBox.Size = new System.Drawing.Size(790, 22); + this.ProgramNameTextBox.Size = new System.Drawing.Size(633, 20); this.ProgramNameTextBox.TabIndex = 2; this.ProgramNameTextBox.Leave += new System.EventHandler(this.ProgramNameTextBox_Leave); // // ProgramNameLabel // this.ProgramNameLabel.AutoSize = true; - this.ProgramNameLabel.Location = new System.Drawing.Point(8, 32); + this.ProgramNameLabel.Location = new System.Drawing.Point(6, 26); this.ProgramNameLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.ProgramNameLabel.Name = "ProgramNameLabel"; - this.ProgramNameLabel.Size = new System.Drawing.Size(479, 17); + this.ProgramNameLabel.Size = new System.Drawing.Size(353, 13); this.ProgramNameLabel.TabIndex = 1; this.ProgramNameLabel.Text = "Program &Title: (Change if this text does NOT appear on program\'s title bar)"; // // TabControl // - this.TabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.TabControl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.TabControl.Controls.Add(this.TabProgramSettings); this.TabControl.Controls.Add(this.TabJumplist); - this.TabControl.Location = new System.Drawing.Point(0, 29); + this.TabControl.Location = new System.Drawing.Point(0, 23); this.TabControl.Margin = new System.Windows.Forms.Padding(2); this.TabControl.Name = "TabControl"; this.TabControl.SelectedIndex = 0; - this.TabControl.Size = new System.Drawing.Size(820, 536); + this.TabControl.Size = new System.Drawing.Size(656, 429); this.TabControl.TabIndex = 1; this.TabControl.SelectedIndexChanged += new System.EventHandler(this.TabControl_SelectedIndexChanged); this.TabControl.SizeChanged += new System.EventHandler(this.TabControl_SizeChanged); // - // TaskKBDSendInBackgroundCheckBox + // OptionToolStripSeparator // - this.TaskKBDSendInBackgroundCheckBox.AutoSize = true; - this.TaskKBDSendInBackgroundCheckBox.Location = new System.Drawing.Point(333, 30); - this.TaskKBDSendInBackgroundCheckBox.Name = "TaskKBDSendInBackgroundCheckBox"; - this.TaskKBDSendInBackgroundCheckBox.Size = new System.Drawing.Size(157, 21); - this.TaskKBDSendInBackgroundCheckBox.TabIndex = 7; - this.TaskKBDSendInBackgroundCheckBox.Text = "Send in background"; - this.TaskKBDSendInBackgroundCheckBox.UseVisualStyleBackColor = true; - this.TaskKBDSendInBackgroundCheckBox.CheckedChanged += new System.EventHandler(this.TaskKBDSendInBackground_CheckedChanged); + this.OptionToolStripSeparator.Name = "OptionToolStripSeparator"; + this.OptionToolStripSeparator.Size = new System.Drawing.Size(242, 6); + this.OptionToolStripSeparator.Visible = false; // - // TaskKBDMinimizeAfterwardCheckBox + // HidePinPromptOptionalOptionMenuItem // - this.TaskKBDMinimizeAfterwardCheckBox.AutoSize = true; - this.TaskKBDMinimizeAfterwardCheckBox.Location = new System.Drawing.Point(170, 30); - this.TaskKBDMinimizeAfterwardCheckBox.Name = "TaskKBDMinimizeAfterwardCheckBox"; - this.TaskKBDMinimizeAfterwardCheckBox.Size = new System.Drawing.Size(153, 21); - this.TaskKBDMinimizeAfterwardCheckBox.TabIndex = 8; - this.TaskKBDMinimizeAfterwardCheckBox.Text = "Minimize/deactivate"; - this.TaskKBDMinimizeAfterwardCheckBox.UseVisualStyleBackColor = true; - this.TaskKBDMinimizeAfterwardCheckBox.CheckedChanged += new System.EventHandler(this.TaskKBDMinimizeAfterwardCheckBox_CheckedChanged); + this.HidePinPromptOptionalOptionMenuItem.Enabled = false; + this.HidePinPromptOptionalOptionMenuItem.Name = "HidePinPromptOptionalOptionMenuItem"; + this.HidePinPromptOptionalOptionMenuItem.Size = new System.Drawing.Size(245, 22); + this.HidePinPromptOptionalOptionMenuItem.Text = "Hide Pin to Taskbar save prompt"; + this.HidePinPromptOptionalOptionMenuItem.Visible = false; + this.HidePinPromptOptionalOptionMenuItem.Click += new System.EventHandler(this.HidePinPromptOptionalOptionMenuItem_Click); + // + // HidePinWarningOptionMenuItem + // + this.HidePinWarningOptionMenuItem.Enabled = false; + this.HidePinWarningOptionMenuItem.Name = "HidePinWarningOptionMenuItem"; + this.HidePinWarningOptionMenuItem.Size = new System.Drawing.Size(245, 22); + this.HidePinWarningOptionMenuItem.Text = "Hide Pin to Taskbar notification"; + this.HidePinWarningOptionMenuItem.Visible = false; // // Primary // - this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; - this.ClientSize = new System.Drawing.Size(820, 590); + this.ClientSize = new System.Drawing.Size(656, 472); this.Controls.Add(this.TabControl); this.Controls.Add(this.StatusBar); this.Controls.Add(this.MenuStrip); @@ -1503,6 +1539,9 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem disableDonationBalloonToolStripMenuItem; private System.Windows.Forms.CheckBox TaskKBDSendInBackgroundCheckBox; private System.Windows.Forms.CheckBox TaskKBDMinimizeAfterwardCheckBox; + private System.Windows.Forms.ToolStripSeparator OptionToolStripSeparator; + private System.Windows.Forms.ToolStripMenuItem HidePinPromptOptionalOptionMenuItem; + private System.Windows.Forms.ToolStripMenuItem HidePinWarningOptionMenuItem; } } diff --git a/T7EPreferences/Primary.cs b/T7EPreferences/Primary.cs index 225bd51..2740aca 100644 --- a/T7EPreferences/Primary.cs +++ b/T7EPreferences/Primary.cs @@ -154,10 +154,24 @@ public Primary() //but that's because the operation sets our appid to something different. Common.ReadTemplates(); + // dummying out donate balloon + //Common.WritePref("DonateDialogDisable", true.ToString()); + //Common.WritePref("DonateBalloonDisable", true.ToString()); + bool donateBalloonShown = false; - bool.TryParse(Common.ReadPref("DonateBalloonShown"), out donateBalloonShown); + //bool.TryParse(Common.ReadPref("DonateBalloonShown"), out donateBalloonShown); //dummying out if (!donateBalloonShown) disableDonationBalloonToolStripMenuItem.Visible = false; + if(Environment.OSVersion.Version.Major >= 10 && Environment.OSVersion.Version.Build >= 10586) + { + bool hidePinPromptOptional = false; + if (Common.PrefExists("HidePinPromptOptional")) bool.TryParse(Common.ReadPref("HidePinPromptOptional"), out hidePinPromptOptional); + HidePinPromptOptionalOptionMenuItem.Checked = hidePinPromptOptional; + + HidePinPromptOptionalOptionMenuItem.Visible = HidePinPromptOptionalOptionMenuItem.Enabled = true; + OptionToolStripSeparator.Visible = true; + } + TaskKBDKeyboardTextBox.SetParent(this); ReadAppList(); @@ -193,6 +207,7 @@ public Primary() public void ShowDonateDialog(bool deliberate) { + return; // dummying out, 2015 Donate donateForm = new Donate(deliberate); donateForm.Show(); } @@ -202,20 +217,28 @@ private void ShowStartDialog() StartDialog_Label: using (Form startForm = new StartForm(this)) { + StartDialogResult = 0; + + if (this.Visible) return; // should not show this when form is visible + DialogResult startResult = startForm.ShowDialog(); if (startResult == DialogResult.Cancel) { // Exit the app - Environment.Exit(-1); + if(!this.Visible) + Environment.Exit(-1); } // Else, DialogResult.OK is OK. - startForm.Hide(); + //startForm.Hide(); + //startForm.Close(); startForm.Dispose(); + switch ((StartDialogResults)StartDialogResult) { case StartDialogResults.NewApp: + this.Hide(); bool openAppResult = OpenProgramFile(); if (!openAppResult) goto StartDialog_Label; @@ -226,11 +249,13 @@ private void ShowStartDialog() } break; case StartDialogResults.OpenApp: + this.Hide(); bool openManageAppResult = OpenManageProgramFile(); if (!openManageAppResult) goto StartDialog_Label; break; case StartDialogResults.OpenPack: + this.Hide(); if (!ImportPack("the current program")) { // Check if edit window is visible. If it isn't, show. @@ -239,7 +264,8 @@ private void ShowStartDialog() } break; default: - Environment.Exit(-1); + if (!this.Visible) + Environment.Exit(-1); break; } } @@ -257,7 +283,11 @@ private bool OpenManageProgramFile() || openForm.SelectedAppId.Length <= 0) { openForm.Dispose(); - if (!Visible) Application.Exit(); // TODO: Make this show start dialog + if (!Visible) + { + //Application.Exit(); // TODO: Make this show start dialog + ShowStartDialog(); + } return false; } @@ -272,32 +302,40 @@ private bool OpenProgramFile() private bool OpenProgramFile(string startPath) { - OpenFileDialog programFileDialog = new OpenFileDialog(); - programFileDialog.Filter = "Program files (*.exe;*.lnk)|*.exe|All files (*.*)|*.*"; - programFileDialog.FilterIndex = 0; - if (Directory.Exists(startPath)) - programFileDialog.InitialDirectory = startPath; + string programFileName = ""; + if (File.Exists(startPath)) + { + programFileName = startPath; + } else - programFileDialog.InitialDirectory = - File.Exists(Path.Combine(Common.Path_AppData, "Programs.library-ms")) ? - Path.Combine(Common.Path_AppData, "Programs.library-ms") - : Path.Combine(Common.EnvPath_AllUsersProfile, "Microsoft\\Windows\\Start Menu"); - programFileDialog.Title = "Select program file"; - programFileDialog.AutoUpgradeEnabled = true; - //programFileDialog.ShowHelp = true; - programFileDialog.DereferenceLinks = false;//false - - DialogResult fileResult = programFileDialog.ShowDialog(); - - if (fileResult != DialogResult.OK) { + OpenFileDialog programFileDialog = new OpenFileDialog(); + programFileDialog.Filter = "Program files (*.exe;*.lnk)|*.exe|All files (*.*)|*.*"; + programFileDialog.FilterIndex = 0; + if (Directory.Exists(startPath)) + programFileDialog.InitialDirectory = startPath; + else + programFileDialog.InitialDirectory = + File.Exists(Path.Combine(Common.Path_AppData, "Programs.library-ms")) ? + Path.Combine(Common.Path_AppData, "Programs.library-ms") + : Path.Combine(Common.EnvPath_AllUsersProfile, "Microsoft\\Windows\\Start Menu"); + programFileDialog.Title = "Select program file"; + programFileDialog.AutoUpgradeEnabled = true; + //programFileDialog.ShowHelp = true; + programFileDialog.DereferenceLinks = false;//false + + DialogResult fileResult = programFileDialog.ShowDialog(); + + if (fileResult != DialogResult.OK) + { + programFileDialog.Dispose(); + return false; + } + programFileDialog.Dispose(); - return false; + programFileName = programFileDialog.FileName; } - programFileDialog.Dispose(); - string programFileName = programFileDialog.FileName; - // Try to resolve it as an mSI shortcut //string msiOutput = MsiShortcutParser.ParseShortcut(programFileName); //if (msiOutput.Length > 0) programFileName = msiOutput; @@ -457,6 +495,8 @@ public bool OpenAppId(string appId, string appPath) break; } + ChangeStatusBarText("Ready."); + // And show the window Show(); WindowState = FormWindowState.Normal; @@ -1449,6 +1489,7 @@ private void MenuToolsAbout_Click(object sender, EventArgs e) private void MenuFileOpen_Click(object sender, EventArgs e) { OpenManageProgramFile(); + } private void JumplistListBox_SelectedIndexChanged(object sender, EventArgs e) @@ -1545,9 +1586,17 @@ private void ChangeAppName(string newAppName) System.ComponentModel.BackgroundWorker StatusBarBackgroundWorker; + string StatusLog = ""; + private void ChangeStatusBarText(string statusText) { - ToolBarStatusLabel.Text = statusText; + string statusString = String.Format("[{0}] {1}", DateTime.Now.ToLongTimeString(), statusText); + + StatusLog = StatusLog + statusString + Environment.NewLine; + + ToolBarStatusLabel.Text = statusString; + + //return; // 0.4-B: Trying to disable this and instead add a timestamp // implement a fade? StatusBarBackgroundWorker = new System.ComponentModel.BackgroundWorker(); StatusBarBackgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(StatusBarBackgroundWorker_DoWork); StatusBarBackgroundWorker.RunWorkerAsync(null); @@ -1555,6 +1604,24 @@ private void ChangeStatusBarText(string statusText) void StatusBarBackgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e) { + // 0.4-B: Blink the text (or bold it?) + //ToolBarStatusLabel.Font = new Font(ToolBarStatusLabel.Font, FontStyle.Bold); + //ToolBarStatusLabel.Font = new Font(ToolBarStatusLabel.Font, FontStyle.Regular); + ToolBarStatusLabel.Visible = false; + Thread.Sleep(250); + ToolBarStatusLabel.Visible = true; + Thread.Sleep(250); + ToolBarStatusLabel.Visible = false; + Thread.Sleep(250); + ToolBarStatusLabel.Visible = true; + /*Thread.Sleep(250); + ToolBarStatusLabel.Visible = false; + Thread.Sleep(250); + ToolBarStatusLabel.Visible = true;*/ + + return; + + // old behavior: wait 10 seconds then replace the text Thread.Sleep(10000); ToolBarStatusLabel.Text = "Ready"; } @@ -2049,12 +2116,114 @@ private void MenuFileSave_Click(object sender, EventArgs e) EditCounter++; } + public string GetLnkPathForTargetName(string processName) + { + try + { + if (processName.Length < 1) return ""; + + // Check for all shortcuts under %appdata%\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar and StartMenu + List shortcutList = new List(); + string userPinnedPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft\\Internet Explorer\\Quick Launch\\User Pinned"); + DirectoryInfo di = new DirectoryInfo(userPinnedPath); + FileInfo[] lnkInfo = di.GetFiles("*.lnk", SearchOption.AllDirectories); + + foreach (FileInfo lnk in lnkInfo) + { + string targetName = Path.GetFileNameWithoutExtension(Common.ResolveLnkPath(lnk.FullName)).ToLower(); + + if (processName.ToLower() == targetName) return lnk.FullName; + } + + return ""; + } catch (Exception e) + { + + } + + return ""; + } + private void saveAndApplyToTaskbarToolStripMenuItem_Click(object sender, EventArgs e) { + string saveMessage = ""; + + if (Environment.OSVersion.Version.Major >= 10) + { + string existingLnkPath = GetLnkPathForTargetName(Path.GetFileNameWithoutExtension(_CurrentAppPath).ToLower()); + if(File.Exists(existingLnkPath) && Common.TaskbarManagerInstance.GetApplicationIdForShortcut(existingLnkPath) != CurrentAppId) + { + DialogResult unpinResult = new PinPrompt(true, existingLnkPath, _CurrentAppName, _CurrentAppPath, CurrentAppId).ShowDialog(); + if(unpinResult != DialogResult.OK) + { + ChangeStatusBarText("Jump list was not saved. The app needs to be unpinned from taskbar before saving."); + return; + } + } + } + Preferences.SaveApp(this); Preferences.ApplyJumplistToTaskbar(this); + + if (Environment.OSVersion.Version.Major >= 10) + { + string existingLnkPath = GetLnkPathForTargetName(Path.GetFileNameWithoutExtension(_CurrentAppPath).ToLower()); + if ((File.Exists(existingLnkPath) && Common.TaskbarManagerInstance.GetApplicationIdForShortcut(existingLnkPath) != CurrentAppId) || !File.Exists(existingLnkPath)) + { + bool hidePinPromptOptional = false; + if (Environment.OSVersion.Version.Build >= 10586) + { + if (Common.PrefExists("HidePinPromptOptional")) bool.TryParse(Common.ReadPref("HidePinPromptOptional"), out hidePinPromptOptional); + } + + if (!hidePinPromptOptional) + { + DialogResult pinResult = new PinPrompt(false, "", _CurrentAppName, _CurrentAppPath, CurrentAppId, (Environment.OSVersion.Version.Build < 10586)).ShowDialog(); + if (pinResult != DialogResult.OK) + { + //Preferences.ApplyBlankJumplistToTaskbar(this); + + ChangeStatusBarText("Jump list was saved, but you'll need to run and pin the app to taskbar before using it."); + return; + } + }/* else + { + ChangeStatusBarText("Jump list saved. If it does not appear, unpin the app, run it, then repin it to taskbar."); + return; + }*/ + } + else if(File.Exists(existingLnkPath) && Common.TaskbarManagerInstance.GetApplicationIdForShortcut(existingLnkPath) == CurrentAppId) + { + saveMessage = "Jump list saved. If it does not appear, unpin the app, run it, then repin it to taskbar."; + } + + this.TopMost = true; + this.TopMost = false; + + } + AppReallyNew = false; - ChangeStatusBarText("Settings saved to taskbar! Right-click your program's shortcut to test it."); + + if(Environment.OSVersion.Version.Major >= 10) + { + if(Environment.OSVersion.Version.Build < 10586) + { + // Check if the shortcut is pinned. If it is, the message should read just to run the app first. + if(saveMessage.Length < 1) saveMessage = "Jump list saved. Right-click your program's shortcut to test it."; + } + else + { + // Check if the shortcut is pinned. If it is, the message should read to run the app first. + saveMessage = "Jump list saved. Run the app to see the jump list."; + } + } + else + { + saveMessage = "Jump list saved. Right-click your program's shortcut to test it."; + } + + ChangeStatusBarText(saveMessage); + EditCounter++; } @@ -2166,10 +2335,17 @@ private bool ImportPack(string appName, string packPath) // But is this desirable? Is it better for the user to select the window? if (loadNewApp) { - if (!OpenProgramFile()) return false; // Closes open app, opens new app - else if (AppReallyNew) + if (packInfo[0].Length <= 0) + { + if (!OpenProgramFile()) return false; // Closes open app, opens new app + } + else { + if (!OpenProgramFile(packInfo[1])) return false; + } + if (AppReallyNew) + { //MessageBox.Show(packInfo[0] + "|" + packInfo[1] + "|" + packInfo[2]); if (packInfo[0].Length <= 0) SelectMainAppWindow(true); else @@ -2208,10 +2384,12 @@ private bool ImportPack(string appName, string packPath) // Load the pack! Preferences.LoadJumplistPack(packPath); - //if (AppReallyNew) saveAndApplyToTaskbarToolStripMenuItem.PerformClick(); // One-click importing for new apps + // 0.4-B feature: one-click importing + if (AppReallyNew) saveAndApplyToTaskbarToolStripMenuItem.PerformClick(); // One-click importing for new apps // Select the jumplist tab when done! - if(loadNewApp) TabControl.SelectedIndex = 1; + if(loadNewApp && !AppReallyNew) TabControl.SelectedIndex = 1; + // Select the first task for (int i = 0; i < JumplistListBox.Items.Count; i++) { @@ -2861,6 +3039,8 @@ private void CheckUpdateString() // We aren't going to download UpdateCheck2.txt here, 'cuz StartForm already did. // Just check the stored UpdateCheck2.txt. + return; //dummying out + if (!File.Exists(Path.Combine(Common.Path_AppData, "UpdateCheck2.txt"))) return; if (!Common.SanitizeUpdateResponse(File.ReadAllText(Path.Combine(Common.Path_AppData, "UpdateCheck2.txt")))) { @@ -2914,5 +3094,16 @@ private void TaskKBDMinimizeAfterwardCheckBox_CheckedChanged(object sender, Even { _CurrentJumplistItem.TaskKBDMinimizeAfterward = TaskKBDMinimizeAfterwardCheckBox.Checked; } + + private void StatusBar_Click(object sender, EventArgs e) + { + new HelpDialog("Status Log", StatusLog).Show(); + } + + private void HidePinPromptOptionalOptionMenuItem_Click(object sender, EventArgs e) + { + HidePinPromptOptionalOptionMenuItem.Checked = !HidePinPromptOptionalOptionMenuItem.Checked; + Common.WritePref("HidePinPromptOptional", HidePinPromptOptionalOptionMenuItem.Checked.ToString()); + } } } diff --git a/T7EPreferences/Primary.resx b/T7EPreferences/Primary.resx index 75cfa75..04024b7 100644 --- a/T7EPreferences/Primary.resx +++ b/T7EPreferences/Primary.resx @@ -130,37 +130,36 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m - dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFXSURBVDhPpZO/S0JRFMfvvyA4uDg5OQjiIC6ioAiC - CAqKg4uLk4vTg9BAQrCpIYiGaImCIggiKCh60OLS1NLUUkND0L/w7ZzDffdy73MJh897Xz7nx3B4TwFQ - 2yDDvcfeJkLy0HCO9fCsLOg+dNXqd+VADuQEnf26zMqjfddWy5+lAzmQE3T263ZB86apFt8LB3IgJ+js - 1+2C2mVNzT5nDuRATtDZr9sF5bNyWL2oonHdQOu2hc59B/2nPoKPQODMjmvcw708Y25QPCmag0WHm3/N - MX2fCpwjH715xizIH+UxeZv8C54xC7IH2TB3mEPhuIDSaQmV8wrqV3WMX8cCZ3Zc4x7u5RmzILOfUaP1 - yIEcyAk6+3V7xPReWg1fhg7kQE7Q2a/bBandlBo8DxzIgZygs1+3C5I7ydh3Ti76D6Cz08Mz5gaJIKE2 - EJKDhnOsxyzY5nf+A4zIJYME4EKFAAAAAElFTkSuQmCC + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFNSURBVDhPpZOxS0JRFMbvvyA4uDg5OQjiIC6ioAiC + CAqKg4uLk4vTg9BAQrCpIYiGaImCIggiKCh60OLS1NLkYkND0L/wdc7hei/3Ppdq+L3z8X3nfMPjPQXg + X8ij89jZRkhAwzqyYwraD221+F44kAeagtZ+bguad001/5o7kAeagtZ+bgvqN3U1+5w5kAeagtZ+bgsq + lxU1WU8cyANNQWs/twXFs2JYviijdl1D47aB1n0L3acuglUgsGaPM97hXb4xBfmTvHlhG6YfU4zfxwJr + P+cbU5A9ymL0NvoVfGMK0gfpMHOYQe44h8JpAaXzEqpXVQxfhwJr9jjjHd7lG1OQ2k+pwXLgQB5oClr7 + udzKI7mXVP2XvgN5oClo7ee2ILGbUL3nngN5oClo7ee2IL4Tj3zn5G3+A2jt57YgFsS2ERLQsI7smIK/ + A/UDjMglgx5kaA8AAAAASUVORK5CYII= - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAScQAA - EnEB89x6jgAAASNJREFUOE+lkyFrQnEUxe9XEAwWk8lmsplEwWIQBIvFZNMiwoTxYAia1pbWlobCysJg - oMFiWhoWk2VlsK9wd8/hKu8Jt2zhx+/4P8/zyv+Jqsp/yPy5+96VFFvL6iBfuvQLMwOdt46Axc8CVjPx - zA6EA+3XtoD59xxWM/HMDoQDrZeWgOQrgdVMPLMD4UD9uS5gdprBaiae2YFwoPZUEzA5TmA1E8/sQDhQ - fawKGH2OYDUTz+xAOFB5qAgYfgxhNRPP7EA4UL4vCxjsB7CaiWd2IBwoLUuJoWf6u76C9BmeCQeKd0Ux - eHnGh7H2Nj2CjDN0eCYcKNwWxNHmunm+xsx2DtiHA/mbvADce7M2Vg2C7Gfsw4HcNCdXqP0GmfNw4C+f - 9S8fGEe760FMOgAAAABJRU5ErkJggg== + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAABIUlE + QVQ4T6WSIUtDcRTF9xUGCytLS2tLa0tjg5WFwWBlZWltK0NwIA9kMJNtac0kChaDIGiwmExiMVksgl/h + eO/hvsu9NjH8OOfc885L/wqAf5HC5H4SeRRgqPcublIY343J7nunClFi3vu4SWF0OyLbr60qRIl57+Mm + heHNkBSfhSpEiXnv4yaF3mWPbD42qhAl5r2PmxS6F12yfl+rQpSY9z5uUugcOmT5ulSFKDHvfdyk0N63 + yeJloQpRYt77uEmhdd4i8+e5KkSJee/jJoXmWbMQUDJ7mpF4E4q4ST9onDYUPp7V2wrThylRrzft9Ju4 + SaF+Ui/B4HpQPmN6vZV93KRQO64Rfe+i6F/1iXq7kbhJoXpU/Q2MdI+bFP4OKj8fGEe7w+8sMQAAAABJ + RU5ErkJggg== - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAlwSFlzAAAScQAA - EnEB89x6jgAAAR5JREFUOE+lk6FrQmEUxe+/IBgsJpPNZDOZLAZBsFhMNpMICuPBEFxaM9lMSysLg8EW - Vkwm29KKZbB/4e6ew/0e7xvcsoUf57x7vnveC+8TVZX/kC2PX8byC7VnkM2rL8wKRs8jAThgqrvvHYH3 - WZmnkqxg+DQUp1xOJTbXlIdfMHgciMHl7dc2AzNkOBMW9B/6haGJ4looqM5wJizoHXsCNp8bqJoS98xA - WNA9dAUsP5ZQNSXumYGwoLPvCFhcFlA1Je6ZgbCgfd8WMD/PoWpK3DMDYUHrriVgdppB1ZS4ZwbCguZt - U8D0fQpVU+KeGQgLGjcNAZPXCVRNiXtmICyor+sC8O+bpnug7pmBsKC2qkmFN/PqwJdZWPCXa/0DSyBL - LZu5m+MAAAAASUVORK5CYII= + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAABJxAAAScQHz3HqOAAABEklE + QVQ4T6WTIWtCcRTF/QqCwWIy2Uw2k8liEASLxWQzyWDCeDAEl9aW1kwmi2Ew2MLKksm2tLIy2Fe4u/dw + /5d7bGPhxznnnndeeq8mIv+CwuR5cok4dM8bCuOnMXAv258tMH/ZFyiMjqNCjAt2K33eUBgehgYGm+8N + YTfr7Jm8oTDYDypFCtVXBfJNqfKGXtDf9cH6c20qqsB99HlDoffYA6uPlamoAvfR5w2F7kMXLM9LU1EF + 7qPPGwqd+w5YnBamogrcR583FNp3bTB/n5uKKnAffd5QaN22wOxtZiqqwH30eUOhedME05epqagC99Hn + DYXGdQPY965a/gNxH33eUKhf1TOvijjmo8sbCn9Har9LIEstwbqXZgAAAABJRU5ErkJggg== @@ -169,10 +168,10 @@ iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m - dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAACOSURBVDhPY/j//z8DJZgizSCLRw2AhUGay/7/WR7/ - /xf4/f9fHvr/f13M//8tSf//d6RBMIgNEgPJgdSA1IL0wALxQ5DB//+rOkjCYD0wA26biUBMJwGD9cAM - OKPEsP+8Ouv/K/q8/2+ai/6/5yD3/5G76v9nvtpgDGKDxEByIDUgtSA9o+kAkgkHPi8AACf26rODPOZg - AAAAAElFTkSuQmCC + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAACqSURBVDhPpYyhCgJREEW3GG1aDYIYDJq0GgQtGgSb + ybDBZLOZDPst+xP7A4LFIoLBYPYPjtz3eKYJDhsODGfuvRlQC1N6MKUHU3owpQdTeohHPqvYL+CwguMG + Tls476DII7rl9FNGWXXSwGc9grJwETpp4DFuxXUHoZMGLt2suvYb3IZN7pM2z2mH17zHezkI6JbTTxll + 1fkN1MGUHkzpwZQeTOnBlP9D9gUn9uqzN106TwAAAABJRU5ErkJggg== \ No newline at end of file diff --git a/T7EPreferences/Program.cs b/T7EPreferences/Program.cs index 2f57e33..3acdd3a 100644 --- a/T7EPreferences/Program.cs +++ b/T7EPreferences/Program.cs @@ -5,11 +5,14 @@ using System.IO; using T7ECommon; using System.Diagnostics; +using System.Threading; namespace T7EPreferences { static class Program { + static Mutex mutex = new Mutex(true, "{467D53F9-24D0-47BA-83F2-214A6791C451}"); + [STAThread] static void Main() { @@ -41,26 +44,43 @@ static void Main() catch (Exception e) { } } -#if DEBUG - Application.EnableVisualStyles(); - Application.Run(new Primary()); - return; -#endif -//IF RELEASE - try + //#if DEBUG + if (mutex.WaitOne(TimeSpan.Zero, true)) { Application.EnableVisualStyles(); Application.Run(new Primary()); - } - catch (Exception e) + mutex.ReleaseMutex(); + } else { - Common.SendExceptionLog(e, Primary._CurrentAppName, Primary._CurrentAppPath); - - Environment.Exit(-1); + Process currentProcess = Process.GetCurrentProcess(); + var runningProcess = (from process in Process.GetProcesses() + where + process.Id != currentProcess.Id && + process.ProcessName.Equals( + currentProcess.ProcessName, + StringComparison.Ordinal) + select process).FirstOrDefault(); + if (runningProcess != null) + { + Interop.SetForegroundWindow(runningProcess.MainWindowHandle); + } } -//ENDIF - } + //#endif + /* + //IF RELEASE + try + { + Application.EnableVisualStyles(); + Application.Run(new Primary()); + } + catch (Exception e) + { + Common.SendExceptionLog(e, Primary._CurrentAppName, Primary._CurrentAppPath); - + Environment.Exit(-1); + } + //ENDIF + */ + } } } diff --git a/T7EPreferences/StartForm.Designer.cs b/T7EPreferences/StartForm.Designer.cs index d520e67..1c653a8 100644 --- a/T7EPreferences/StartForm.Designer.cs +++ b/T7EPreferences/StartForm.Designer.cs @@ -53,10 +53,10 @@ private void InitializeComponent() // this.StartLabel.AutoSize = true; this.StartLabel.Font = new System.Drawing.Font("Microsoft Sans Serif", 10.2F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.StartLabel.Location = new System.Drawing.Point(11, 12); + this.StartLabel.Location = new System.Drawing.Point(9, 10); this.StartLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.StartLabel.Name = "StartLabel"; - this.StartLabel.Size = new System.Drawing.Size(270, 20); + this.StartLabel.Size = new System.Drawing.Size(230, 17); this.StartLabel.TabIndex = 0; this.StartLabel.Text = "Welcome to Jumplist Extender."; // @@ -64,27 +64,27 @@ private void InitializeComponent() // this.ExitButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.ExitButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.ExitButton.Location = new System.Drawing.Point(305, 12); + this.ExitButton.Location = new System.Drawing.Point(244, 10); this.ExitButton.Margin = new System.Windows.Forms.Padding(2); this.ExitButton.Name = "ExitButton"; - this.ExitButton.Size = new System.Drawing.Size(94, 29); + this.ExitButton.Size = new System.Drawing.Size(75, 23); this.ExitButton.TabIndex = 1; this.ExitButton.Text = "&Close"; this.ExitButton.UseVisualStyleBackColor = true; // // ExitPanel // - this.ExitPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.ExitPanel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.ExitPanel.BackColor = System.Drawing.SystemColors.Control; this.ExitPanel.Controls.Add(this.DonatePictureBox); this.ExitPanel.Controls.Add(this.linkLabel1); this.ExitPanel.Controls.Add(this.ExitButton); this.ExitPanel.Controls.Add(this.UpdateLinkLabel); - this.ExitPanel.Location = new System.Drawing.Point(0, 292); + this.ExitPanel.Location = new System.Drawing.Point(0, 234); this.ExitPanel.Margin = new System.Windows.Forms.Padding(2); this.ExitPanel.Name = "ExitPanel"; - this.ExitPanel.Size = new System.Drawing.Size(422, 68); + this.ExitPanel.Size = new System.Drawing.Size(338, 54); this.ExitPanel.TabIndex = 3; // // DonatePictureBox @@ -92,10 +92,10 @@ private void InitializeComponent() this.DonatePictureBox.Cursor = System.Windows.Forms.Cursors.Hand; this.DonatePictureBox.Enabled = false; this.DonatePictureBox.Image = ((System.Drawing.Image)(resources.GetObject("DonatePictureBox.Image"))); - this.DonatePictureBox.Location = new System.Drawing.Point(208, 14); + this.DonatePictureBox.Location = new System.Drawing.Point(166, 11); this.DonatePictureBox.Margin = new System.Windows.Forms.Padding(2); this.DonatePictureBox.Name = "DonatePictureBox"; - this.DonatePictureBox.Size = new System.Drawing.Size(92, 26); + this.DonatePictureBox.Size = new System.Drawing.Size(74, 21); this.DonatePictureBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; this.DonatePictureBox.TabIndex = 3; this.DonatePictureBox.TabStop = false; @@ -105,23 +105,24 @@ private void InitializeComponent() // linkLabel1 // this.linkLabel1.AutoSize = true; - this.linkLabel1.Location = new System.Drawing.Point(12, 19); + this.linkLabel1.Location = new System.Drawing.Point(10, 15); this.linkLabel1.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.linkLabel1.Name = "linkLabel1"; - this.linkLabel1.Size = new System.Drawing.Size(153, 17); + this.linkLabel1.Size = new System.Drawing.Size(116, 13); this.linkLabel1.TabIndex = 0; this.linkLabel1.TabStop = true; this.linkLabel1.Text = "&Visit the official website"; + this.linkLabel1.Visible = false; this.linkLabel1.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabel1_LinkClicked); // // UpdateLinkLabel // this.UpdateLinkLabel.AutoSize = true; this.UpdateLinkLabel.Enabled = false; - this.UpdateLinkLabel.Location = new System.Drawing.Point(12, 19); + this.UpdateLinkLabel.Location = new System.Drawing.Point(10, 15); this.UpdateLinkLabel.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0); this.UpdateLinkLabel.Name = "UpdateLinkLabel"; - this.UpdateLinkLabel.Size = new System.Drawing.Size(253, 17); + this.UpdateLinkLabel.Size = new System.Drawing.Size(192, 13); this.UpdateLinkLabel.TabIndex = 2; this.UpdateLinkLabel.TabStop = true; this.UpdateLinkLabel.Text = "&Version {0} is released! &Download now."; @@ -134,8 +135,8 @@ private void InitializeComponent() this.fileToolStripMenuItem}); this.menuStrip1.Location = new System.Drawing.Point(0, 0); this.menuStrip1.Name = "menuStrip1"; - this.menuStrip1.Padding = new System.Windows.Forms.Padding(5, 2, 0, 2); - this.menuStrip1.Size = new System.Drawing.Size(415, 26); + this.menuStrip1.Padding = new System.Windows.Forms.Padding(4, 2, 0, 2); + this.menuStrip1.Size = new System.Drawing.Size(332, 21); this.menuStrip1.TabIndex = 6; this.menuStrip1.Text = "menuStrip1"; this.menuStrip1.Visible = false; @@ -147,14 +148,14 @@ private void InitializeComponent() this.openToolStripMenuItem, this.importJumplistPackToolStripMenuItem}); this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; - this.fileToolStripMenuItem.Size = new System.Drawing.Size(40, 22); + this.fileToolStripMenuItem.Size = new System.Drawing.Size(37, 17); this.fileToolStripMenuItem.Text = "File"; // // newToolStripMenuItem // this.newToolStripMenuItem.Name = "newToolStripMenuItem"; this.newToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.N))); - this.newToolStripMenuItem.Size = new System.Drawing.Size(258, 22); + this.newToolStripMenuItem.Size = new System.Drawing.Size(222, 22); this.newToolStripMenuItem.Text = "New"; this.newToolStripMenuItem.Click += new System.EventHandler(this.newToolStripMenuItem_Click); // @@ -162,7 +163,7 @@ private void InitializeComponent() // this.openToolStripMenuItem.Name = "openToolStripMenuItem"; this.openToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O))); - this.openToolStripMenuItem.Size = new System.Drawing.Size(258, 22); + this.openToolStripMenuItem.Size = new System.Drawing.Size(222, 22); this.openToolStripMenuItem.Text = "Open"; this.openToolStripMenuItem.Click += new System.EventHandler(this.openToolStripMenuItem_Click); // @@ -170,7 +171,7 @@ private void InitializeComponent() // this.importJumplistPackToolStripMenuItem.Name = "importJumplistPackToolStripMenuItem"; this.importJumplistPackToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.I))); - this.importJumplistPackToolStripMenuItem.Size = new System.Drawing.Size(258, 22); + this.importJumplistPackToolStripMenuItem.Size = new System.Drawing.Size(222, 22); this.importJumplistPackToolStripMenuItem.Text = "Import Jumplist Pack"; this.importJumplistPackToolStripMenuItem.Click += new System.EventHandler(this.importJumplistPackToolStripMenuItem_Click); // @@ -180,33 +181,33 @@ private void InitializeComponent() // // StartImportButton // - this.StartImportButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.StartImportButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.StartImportButton.BackColor = System.Drawing.Color.Transparent; this.StartImportButton.DialogResult = System.Windows.Forms.DialogResult.OK; this.StartImportButton.FlatStyle = System.Windows.Forms.FlatStyle.System; this.StartImportButton.HelpText = "Import into a new or existing program."; - this.StartImportButton.Location = new System.Drawing.Point(11, 202); + this.StartImportButton.Location = new System.Drawing.Point(9, 162); this.StartImportButton.Margin = new System.Windows.Forms.Padding(2); this.StartImportButton.Name = "StartImportButton"; - this.StartImportButton.Size = new System.Drawing.Size(388, 75); + this.StartImportButton.Size = new System.Drawing.Size(310, 60); this.StartImportButton.TabIndex = 2; - this.StartImportButton.Text = "I&mport a jumplist pack"; + this.StartImportButton.Text = "I&mport a jump list pack"; this.StartImportButton.UseVisualStyleBackColor = false; this.StartImportButton.Click += new System.EventHandler(this.StartImportButton_Click); // // StartOpenButton // - this.StartOpenButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.StartOpenButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.StartOpenButton.BackColor = System.Drawing.Color.Transparent; this.StartOpenButton.DialogResult = System.Windows.Forms.DialogResult.OK; this.StartOpenButton.FlatStyle = System.Windows.Forms.FlatStyle.System; this.StartOpenButton.HelpText = "Open, toggle, or delete a previous jump list."; - this.StartOpenButton.Location = new System.Drawing.Point(11, 122); + this.StartOpenButton.Location = new System.Drawing.Point(9, 98); this.StartOpenButton.Margin = new System.Windows.Forms.Padding(2); this.StartOpenButton.Name = "StartOpenButton"; - this.StartOpenButton.Size = new System.Drawing.Size(388, 75); + this.StartOpenButton.Size = new System.Drawing.Size(310, 60); this.StartOpenButton.TabIndex = 1; this.StartOpenButton.Text = "&Edit a previously saved jump list"; this.StartOpenButton.UseVisualStyleBackColor = false; @@ -214,16 +215,16 @@ private void InitializeComponent() // // StartNewButton // - this.StartNewButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); + this.StartNewButton.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.StartNewButton.BackColor = System.Drawing.Color.Transparent; this.StartNewButton.DialogResult = System.Windows.Forms.DialogResult.OK; this.StartNewButton.FlatStyle = System.Windows.Forms.FlatStyle.System; this.StartNewButton.HelpText = "Start from a program shortcut or executable file"; - this.StartNewButton.Location = new System.Drawing.Point(11, 42); + this.StartNewButton.Location = new System.Drawing.Point(9, 34); this.StartNewButton.Margin = new System.Windows.Forms.Padding(2); this.StartNewButton.Name = "StartNewButton"; - this.StartNewButton.Size = new System.Drawing.Size(388, 75); + this.StartNewButton.Size = new System.Drawing.Size(310, 60); this.StartNewButton.TabIndex = 0; this.StartNewButton.Text = "Start a &new jump list"; this.StartNewButton.UseVisualStyleBackColor = false; @@ -231,10 +232,10 @@ private void InitializeComponent() // // StartForm // - this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; - this.BackColor = System.Drawing.Color.White; - this.ClientSize = new System.Drawing.Size(415, 348); + this.BackColor = System.Drawing.SystemColors.Window; + this.ClientSize = new System.Drawing.Size(332, 278); this.Controls.Add(this.StartImportButton); this.Controls.Add(this.ExitPanel); this.Controls.Add(this.StartOpenButton); diff --git a/T7EPreferences/StartForm.cs b/T7EPreferences/StartForm.cs index 215073c..9839a25 100644 --- a/T7EPreferences/StartForm.cs +++ b/T7EPreferences/StartForm.cs @@ -21,6 +21,14 @@ public partial class StartForm : Form Primary PrimaryForm; public StartForm(Primary primaryFormRef) { + if (primaryFormRef.Visible) + { + primaryFormRef.StartDialogResult = 0; + this.DialogResult = DialogResult.OK; + this.Close(); + return; // this form only has effect if Primary form is not visible. See Primary.ShowStartForm() + } + InitializeComponent(); PrimaryForm = primaryFormRef; @@ -30,7 +38,8 @@ public StartForm(Primary primaryFormRef) else StartOpenButton.Enabled = true; // Check to show donate link - if (!Common.PrefExists("InstallDate")) + // dummying out + /*if (true == false && !Common.PrefExists("InstallDate")) { if(Common.AppCount > 0) Common.WritePref("InstallDate", DateTime.Today.Year.ToString()+"-"+DateTime.Today.Month.ToString()+"-"+DateTime.Today.Day.ToString() , "InstallUpgrade", false.ToString()); @@ -47,17 +56,20 @@ public StartForm(Primary primaryFormRef) // Also, display the donate icon // This might be made invisible by later linklabels. DonatePictureBox.Enabled = DonatePictureBox.Visible = true; - } + }*/ // Check for new version - UpdateCheckWorker.RunWorkerAsync(); - CheckNewVersion(); + // dummying out + //UpdateCheckWorker.RunWorkerAsync(); + //CheckNewVersion(); } private string VersionHttpLink = ""; private void CheckNewVersion() { + return; //dummying out + if (!File.Exists(Path.Combine(Common.Path_AppData, "UpdateCheck2.txt"))) return; if (!Common.SanitizeUpdateResponse(File.ReadAllText(Path.Combine(Common.Path_AppData, "UpdateCheck2.txt")))) { @@ -132,6 +144,8 @@ private void UpdateLinkLabel_LinkClicked(object sender, LinkLabelLinkClickedEven private void UpdateCheckWorker_DoWork(object sender, DoWorkEventArgs e) { + return; // dummying out + if ((File.Exists(Path.Combine(Common.Path_AppData, "UpdateCheck2.txt")) && File.GetCreationTime(Path.Combine(Common.Path_AppData, "UpdateCheck2.txt")).Day - DateTime.Now.Day <= -1) || !File.Exists(Path.Combine(Common.Path_AppData, "UpdateCheck2.txt")) @@ -154,23 +168,44 @@ private void DonatePictureBox_Click(object sender, EventArgs e) //PrimaryForm.ShowDonateDialog(true); } + protected void ReallyCenterToScreen() + { + Screen screen = Screen.FromControl(this); + + Rectangle workingArea = screen.WorkingArea; + this.Location = new Point() + { + X = Math.Max(workingArea.X, workingArea.X + (workingArea.Width - this.Width) / 2), + Y = Math.Max(workingArea.Y, workingArea.Y + (workingArea.Height - this.Height) / 2) + }; + } + private void StartForm_Shown(object sender, EventArgs e) { + this.ReallyCenterToScreen(); + this.Activate(); + DateTime installDate = DateTime.Today; bool installUpgrade = false; + + // dummying out + bool donateDialogDisable = true;// false; + + /* DateTime.TryParse(Common.ReadPref("InstallDate"), out installDate); bool.TryParse(Common.ReadPref("InstallUpgrade"), out installUpgrade); if ((DateTime.Today - installDate).Days >= 3 || installUpgrade == true) { // if disabledialog, then show will hide - bool donateDialogDisable = false; - bool.TryParse(Common.ReadPref("DonateDialogDisable"), out donateDialogDisable); + // dummying out + bool donateDialogDisable = true;// false; + /*bool.TryParse(Common.ReadPref("DonateDialogDisable"), out donateDialogDisable); if (!donateDialogDisable) { Donate donationWindow = new Donate(false); donationWindow.Show(); - } - } + }// + }*/ } diff --git a/T7EPreferences/StartForm.resx b/T7EPreferences/StartForm.resx index 9546334..093b898 100644 --- a/T7EPreferences/StartForm.resx +++ b/T7EPreferences/StartForm.resx @@ -120,31 +120,30 @@ - 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 + QmCC diff --git a/T7EPreferences/T7EPreferences.csproj b/T7EPreferences/T7EPreferences.csproj index 48cf929..d000fbc 100644 --- a/T7EPreferences/T7EPreferences.csproj +++ b/T7EPreferences/T7EPreferences.csproj @@ -52,7 +52,7 @@ false - bin\x86\Release\ + ..\bin\Release\ TRACE true pdbonly @@ -61,8 +61,10 @@ false false + + - true + app.manifest @@ -136,6 +138,12 @@ ManageForm.cs + + Form + + + PinPrompt.cs + Form @@ -163,6 +171,9 @@ ManageForm.cs + + PinPrompt.cs + Primary.cs Designer @@ -183,6 +194,8 @@ Resources.resx True + + SettingsSingleFileGenerator Settings.Designer.cs @@ -208,23 +221,31 @@ - {CE53747F-D2E6-4E1E-9EF4-A0AE02671B1D} + {ce53747f-d2e6-4e1e-9ef4-a0ae02671b1d} IconLib - {33D6FF5D-C30C-4976-B35D-98CDF7519BA0} + {33d6ff5d-c30c-4976-b35d-98cdf7519ba0} ImageComboBox - {0E7413FF-EB9E-4714-ACF2-BE3A6A7B2FFD} + {0e7413ff-eb9e-4714-acf2-be3a6a7b2ffd} ICSharpCode.SharpZLib - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D} + {aa0c00cb-8699-4f37-bfae-40ca87acc06d} WindowsAPICodePack_Shell + + {e7cf6354-3ccf-4a03-9be5-a8690348c091} + StartAHKElevated + + + {d3f91321-07f0-4eb1-93f0-ad68d05dead0} + T7EBackground + - {7DF8C0C9-F89C-42BD-99B2-D5DCB13FA0BD} + {7df8c0c9-f89c-42bd-99b2-d5dcb13fa0bd} T7ECommon @@ -240,10 +261,10 @@ if not exist "$(TargetPath).locked" if exist "$(TargetPath)" move "$(TargetPath)" "$(TargetPath).locked" - copy $(TargetPath) $(SolutionDir)bin\Release -copy "$(TargetPath)" "$(TargetPath).locked" + copy "$(TargetPath)" "$(TargetPath).locked" if exist "$(TargetDir)Defaults\Icons\" xcopy "$(SolutionDir)Common\Defaults\*" "$(TargetDir)" /e /y /i /exclude:$(ProjectDir)T7EPreferences_Build_Exclude.txt -if not exist "$(TargetDir)Defaults\Icons\" xcopy "$(SolutionDir)Common\Defaults\*" "$(TargetDir)" /e /y /i +if not exist "$(TargetDir)Defaults\Icons\" xcopy "$(SolutionDir)Common\Defaults\*" "$(TargetDir)" /e /y /i +rem if "$(ConfigurationName)"=="Release" xcopy "$(TargetDir)" "$(SolutionDir)bin\Release" /e /y /i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TaskbarExtender.sln b/TaskbarExtender.sln index 0e36c43..3e8ebc3 100644 --- a/TaskbarExtender.sln +++ b/TaskbarExtender.sln @@ -1,6 +1,8 @@  -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "T7EPreferences", "T7EPreferences\T7EPreferences.csproj", "{2B325B8E-06F0-4744-9C81-931760378A67}" ProjectSection(ProjectDependencies) = postProject {CE53747F-D2E6-4E1E-9EF4-A0AE02671B1D} = {CE53747F-D2E6-4E1E-9EF4-A0AE02671B1D} @@ -18,6 +20,9 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IconLib", "Libraries\IconLib\IconLib.csproj", "{CE53747F-D2E6-4E1E-9EF4-A0AE02671B1D}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsAPICodePack_Shell", "Libraries\WindowsAPICodePack\Shell\WindowsAPICodePack_Shell.csproj", "{AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}" + ProjectSection(ProjectDependencies) = postProject + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57} = {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57} + EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsAPICodePack_Core", "Libraries\WindowsAPICodePack\Core\WindowsAPICodePack_Core.csproj", "{2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}" EndProject @@ -112,40 +117,40 @@ Global {CE53747F-D2E6-4E1E-9EF4-A0AE02671B1D}.Release|x86.Build.0 = Release|x86 {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|Any CPU.ActiveCfg = CodeAnalysisDebug|Any CPU {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|Any CPU.Build.0 = CodeAnalysisDebug|Any CPU - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|Mixed Platforms.ActiveCfg = CodeAnalysisDebug|x86 - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|Mixed Platforms.Build.0 = CodeAnalysisDebug|x86 - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|x86.ActiveCfg = CodeAnalysisDebug|x86 - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|x86.Build.0 = CodeAnalysisDebug|x86 + {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|Mixed Platforms.ActiveCfg = CodeAnalysisDebug|Any CPU + {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|Mixed Platforms.Build.0 = CodeAnalysisDebug|Any CPU + {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|x86.ActiveCfg = CodeAnalysisDebug|Any CPU + {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.CodeAnalysisDebug|x86.Build.0 = CodeAnalysisDebug|Any CPU {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|x86.ActiveCfg = Debug|x86 - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|x86.Build.0 = Debug|x86 + {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|x86.ActiveCfg = Debug|Any CPU + {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Debug|x86.Build.0 = Debug|Any CPU {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|Any CPU.ActiveCfg = Release|Any CPU {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|Any CPU.Build.0 = Release|Any CPU - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|Mixed Platforms.Build.0 = Release|x86 - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|x86.ActiveCfg = Release|x86 - {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|x86.Build.0 = Release|x86 + {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|x86.ActiveCfg = Release|Any CPU + {AA0C00CB-8699-4F37-BFAE-40CA87ACC06D}.Release|x86.Build.0 = Release|Any CPU {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|Mixed Platforms.ActiveCfg = Debug|x86 - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|Mixed Platforms.Build.0 = Debug|x86 - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|x86.ActiveCfg = Debug|x86 - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|x86.Build.0 = Debug|x86 + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|Mixed Platforms.Build.0 = Debug|Any CPU + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|x86.ActiveCfg = Debug|Any CPU + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.CodeAnalysisDebug|x86.Build.0 = Debug|Any CPU {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|x86.ActiveCfg = Debug|x86 - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|x86.Build.0 = Debug|x86 + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|x86.ActiveCfg = Debug|Any CPU + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Debug|x86.Build.0 = Debug|Any CPU {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|Any CPU.ActiveCfg = Release|Any CPU {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|Any CPU.Build.0 = Release|Any CPU - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|Mixed Platforms.Build.0 = Release|x86 - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|x86.ActiveCfg = Release|x86 - {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|x86.Build.0 = Release|x86 + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|x86.ActiveCfg = Release|Any CPU + {2E1FB0DF-F9BB-4909-9F32-2D9D022A8E57}.Release|x86.Build.0 = Release|Any CPU {33D6FF5D-C30C-4976-B35D-98CDF7519BA0}.CodeAnalysisDebug|Any CPU.ActiveCfg = Debug|Any CPU {33D6FF5D-C30C-4976-B35D-98CDF7519BA0}.CodeAnalysisDebug|Any CPU.Build.0 = Debug|Any CPU {33D6FF5D-C30C-4976-B35D-98CDF7519BA0}.CodeAnalysisDebug|Mixed Platforms.ActiveCfg = Debug|x86 @@ -199,7 +204,8 @@ Global {FA341098-CDFB-45FB-A1D7-9F93CE4A8741}.CodeAnalysisDebug|Mixed Platforms.Build.0 = Debug|x86 {FA341098-CDFB-45FB-A1D7-9F93CE4A8741}.CodeAnalysisDebug|x86.ActiveCfg = Debug|x86 {FA341098-CDFB-45FB-A1D7-9F93CE4A8741}.CodeAnalysisDebug|x86.Build.0 = Debug|x86 - {FA341098-CDFB-45FB-A1D7-9F93CE4A8741}.Debug|Any CPU.ActiveCfg = Debug|x86 + {FA341098-CDFB-45FB-A1D7-9F93CE4A8741}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FA341098-CDFB-45FB-A1D7-9F93CE4A8741}.Debug|Any CPU.Build.0 = Debug|Any CPU {FA341098-CDFB-45FB-A1D7-9F93CE4A8741}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {FA341098-CDFB-45FB-A1D7-9F93CE4A8741}.Debug|Mixed Platforms.Build.0 = Debug|x86 {FA341098-CDFB-45FB-A1D7-9F93CE4A8741}.Debug|x86.ActiveCfg = Debug|x86 @@ -214,7 +220,8 @@ Global {B442457A-698C-458F-87DF-D37EA182F60E}.CodeAnalysisDebug|Mixed Platforms.Build.0 = Debug|x86 {B442457A-698C-458F-87DF-D37EA182F60E}.CodeAnalysisDebug|x86.ActiveCfg = Debug|x86 {B442457A-698C-458F-87DF-D37EA182F60E}.CodeAnalysisDebug|x86.Build.0 = Debug|x86 - {B442457A-698C-458F-87DF-D37EA182F60E}.Debug|Any CPU.ActiveCfg = Debug|x86 + {B442457A-698C-458F-87DF-D37EA182F60E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B442457A-698C-458F-87DF-D37EA182F60E}.Debug|Any CPU.Build.0 = Debug|Any CPU {B442457A-698C-458F-87DF-D37EA182F60E}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {B442457A-698C-458F-87DF-D37EA182F60E}.Debug|Mixed Platforms.Build.0 = Debug|x86 {B442457A-698C-458F-87DF-D37EA182F60E}.Debug|x86.ActiveCfg = Debug|x86 @@ -230,7 +237,8 @@ Global {E7CF6354-3CCF-4A03-9BE5-A8690348C091}.CodeAnalysisDebug|Mixed Platforms.Build.0 = Debug|x86 {E7CF6354-3CCF-4A03-9BE5-A8690348C091}.CodeAnalysisDebug|x86.ActiveCfg = Debug|x86 {E7CF6354-3CCF-4A03-9BE5-A8690348C091}.CodeAnalysisDebug|x86.Build.0 = Debug|x86 - {E7CF6354-3CCF-4A03-9BE5-A8690348C091}.Debug|Any CPU.ActiveCfg = Debug|x86 + {E7CF6354-3CCF-4A03-9BE5-A8690348C091}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E7CF6354-3CCF-4A03-9BE5-A8690348C091}.Debug|Any CPU.Build.0 = Debug|Any CPU {E7CF6354-3CCF-4A03-9BE5-A8690348C091}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {E7CF6354-3CCF-4A03-9BE5-A8690348C091}.Debug|Mixed Platforms.Build.0 = Debug|x86 {E7CF6354-3CCF-4A03-9BE5-A8690348C091}.Debug|x86.ActiveCfg = Debug|x86