diff --git a/CSScriptAddon/CSScriptAddon.vb b/CSScriptAddon/CSScriptAddon.vb new file mode 100644 index 0000000..a4a7ef4 --- /dev/null +++ b/CSScriptAddon/CSScriptAddon.vb @@ -0,0 +1,46 @@ +' mpv.net +' Copyright(C) 2017 stax76 +' +' This program Is free software: you can redistribute it And/Or modify +' it under the terms of the GNU General Public License as published by +' the Free Software Foundation, either version 3 of the License, Or +' (at your option) any later version. +' +' This program Is distributed in the hope that it will be useful, +' but WITHOUT ANY WARRANTY; without even the implied warranty of +' MERCHANTABILITY Or FITNESS FOR A PARTICULAR PURPOSE.See the +' GNU General Public License for more details. +' +' You should have received a copy of the GNU General Public License +' along with this program. If Not, see http://www.gnu.org/licenses/. + +Imports System.ComponentModel.Composition +Imports System.IO + +Imports vbnet +Imports mpvnet +Imports vbnet.UI.MainModule + +Imports CSScriptLibrary + + +Public Class CSScriptAddon + Implements IAddon + + Sub New() + Dim scriptDir = Folder.AppDataRoaming + "mpv\scripts" + If Not Directory.Exists(scriptDir) Then Return + Dim csxFiles = Directory.GetFiles(scriptDir, "*.cs") + If csxFiles.Count = 0 Then Return + CSScriptLibrary.CSScript.EvaluatorConfig.Engine = EvaluatorEngine.CodeDom + CSScriptLibrary.CSScript.Evaluator.ReferenceDomainAssemblies() + + For Each i In csxFiles + Try + CSScriptLibrary.CSScript.Evaluator.LoadCode(File.ReadAllText(i)) + Catch ex As Exception + MsgException(ex) + End Try + Next + End Sub +End Class \ No newline at end of file diff --git a/CSScriptAddon/CSScriptAddon.vbproj b/CSScriptAddon/CSScriptAddon.vbproj new file mode 100644 index 0000000..f8c0d4a --- /dev/null +++ b/CSScriptAddon/CSScriptAddon.vbproj @@ -0,0 +1,124 @@ + + + + + Debug + AnyCPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA} + Library + CSScriptAddon + CSScriptAddon + 512 + Windows + v4.7 + + + + true + full + true + true + ..\mpvnet\bin\Debug\Addons\CSScript\ + + + 42105,42106,42107,42353,42354,42355 + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036 + + + pdbonly + false + true + true + bin\Release\ + + + 42105,42106,42107,42353,42354,42355 + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036 + + + On + + + Binary + + + On + + + On + + + + False + .\CSScriptLibrary.dll + + + False + ..\mpvnet\bin\Debug\mpvnet.exe + + + + + + + + + + + + ..\vbnet\bin\Debug\vbnet.dll + + + + + + + + + + + + + + + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + + + \ No newline at end of file diff --git a/CSScriptAddon/CSScriptLibrary.dll b/CSScriptAddon/CSScriptLibrary.dll new file mode 100644 index 0000000..f790088 Binary files /dev/null and b/CSScriptAddon/CSScriptLibrary.dll differ diff --git a/CSScriptAddon/My Project/Application.Designer.vb b/CSScriptAddon/My Project/Application.Designer.vb new file mode 100644 index 0000000..88dd01c --- /dev/null +++ b/CSScriptAddon/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/CSScriptAddon/My Project/Application.myapp b/CSScriptAddon/My Project/Application.myapp new file mode 100644 index 0000000..758895d --- /dev/null +++ b/CSScriptAddon/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 1 + true + diff --git a/CSScriptAddon/My Project/AssemblyInfo.vb b/CSScriptAddon/My Project/AssemblyInfo.vb new file mode 100644 index 0000000..7a53968 --- /dev/null +++ b/CSScriptAddon/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' 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. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' 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 Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/CSScriptAddon/My Project/Resources.Designer.vb b/CSScriptAddon/My Project/Resources.Designer.vb new file mode 100644 index 0000000..2ac29fc --- /dev/null +++ b/CSScriptAddon/My Project/Resources.Designer.vb @@ -0,0 +1,63 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("CSScriptAddon.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/CSScriptAddon/My Project/Resources.resx b/CSScriptAddon/My Project/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/CSScriptAddon/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/CSScriptAddon/My Project/Settings.Designer.vb b/CSScriptAddon/My Project/Settings.Designer.vb new file mode 100644 index 0000000..788fc48 --- /dev/null +++ b/CSScriptAddon/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.CSScriptAddon.My.MySettings + Get + Return Global.CSScriptAddon.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/CSScriptAddon/My Project/Settings.settings b/CSScriptAddon/My Project/Settings.settings new file mode 100644 index 0000000..85b890b --- /dev/null +++ b/CSScriptAddon/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/RatingAddon/Rating.cs b/RatingAddon/Rating.cs index 3b1accf..349eeb0 100644 --- a/RatingAddon/Rating.cs +++ b/RatingAddon/Rating.cs @@ -68,7 +68,7 @@ namespace Rating { int rating; - if (args?.Length < 2 || args[0] != "Rating" || ! int.TryParse(args[1], out rating)) + if (args?.Length != 2 || args[0] != "rate-file" || ! int.TryParse(args[1], out rating)) return; Dic[mpv.GetStringProp("path")] = rating; diff --git a/mpv.net.sln b/mpv.net.sln index a8754dc..d92e953 100644 --- a/mpv.net.sln +++ b/mpv.net.sln @@ -4,9 +4,17 @@ Microsoft Visual Studio Solution File, Format Version 12.00 VisualStudioVersion = 15.0.26730.8 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mpv.net", "mpvnet\mpv.net.csproj", "{1751F378-8EDF-4B62-BE6D-304C7C287089}" + ProjectSection(ProjectDependencies) = postProject + {55C88710-539D-4402-84C8-31694841C731} = {55C88710-539D-4402-84C8-31694841C731} + {71808A87-8B1C-4DF8-957C-D79C3B164CCA} = {71808A87-8B1C-4DF8-957C-D79C3B164CCA} + EndProjectSection EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rating", "RatingAddon\Rating.csproj", "{55C88710-539D-4402-84C8-31694841C731}" EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "vbnet", "vbnet\vbnet.vbproj", "{AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}" +EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "CSScriptAddon", "CSScriptAddon\CSScriptAddon.vbproj", "{71808A87-8B1C-4DF8-957C-D79C3B164CCA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -41,6 +49,30 @@ Global {55C88710-539D-4402-84C8-31694841C731}.Release|x64.Build.0 = Release|x64 {55C88710-539D-4402-84C8-31694841C731}.Release|x86.ActiveCfg = Release|x86 {55C88710-539D-4402-84C8-31694841C731}.Release|x86.Build.0 = Release|x86 + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}.Debug|x64.ActiveCfg = Debug|Any CPU + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}.Debug|x64.Build.0 = Debug|Any CPU + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}.Debug|x86.ActiveCfg = Debug|Any CPU + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}.Debug|x86.Build.0 = Debug|Any CPU + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}.Release|Any CPU.Build.0 = Release|Any CPU + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}.Release|x64.ActiveCfg = Release|Any CPU + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}.Release|x64.Build.0 = Release|Any CPU + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}.Release|x86.ActiveCfg = Release|Any CPU + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6}.Release|x86.Build.0 = Release|Any CPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Debug|x64.ActiveCfg = Debug|Any CPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Debug|x64.Build.0 = Debug|Any CPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Debug|x86.ActiveCfg = Debug|Any CPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Debug|x86.Build.0 = Debug|Any CPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|Any CPU.Build.0 = Release|Any CPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|x64.ActiveCfg = Release|Any CPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|x64.Build.0 = Release|Any CPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|x86.ActiveCfg = Release|Any CPU + {71808A87-8B1C-4DF8-957C-D79C3B164CCA}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/mpvnet/Addon.cs b/mpvnet/Addon.cs index 1729729..b10ffb8 100644 --- a/mpvnet/Addon.cs +++ b/mpvnet/Addon.cs @@ -23,6 +23,8 @@ using System.ComponentModel.Composition.Hosting; using System.IO; using System.Windows.Forms; +using static vbnet.UI.MainModule; + // MEF (Managed Extension Framework) namespace mpvnet @@ -36,24 +38,31 @@ namespace mpvnet public Addon() { - AggregateCatalog catalog = new AggregateCatalog(); - - string dir = Application.StartupPath + "\\Addons"; - - if (Directory.Exists(dir)) - foreach (string i in Directory.GetDirectories(dir)) - catalog.Catalogs.Add(new DirectoryCatalog(i, "*Addon.dll")); - - dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\Addons"; - - if (Directory.Exists(dir)) - foreach (string i in Directory.GetDirectories(dir)) - catalog.Catalogs.Add(new DirectoryCatalog(i, "*Addon.dll")); - - if (catalog.Catalogs.Count > 0) + try { - CompositionContainer = new CompositionContainer(catalog); - CompositionContainer.ComposeParts(this); + AggregateCatalog catalog = new AggregateCatalog(); + + string dir = Application.StartupPath + "\\Addons"; + + if (Directory.Exists(dir)) + foreach (string i in Directory.GetDirectories(dir)) + catalog.Catalogs.Add(new DirectoryCatalog(i, "*Addon.dll")); + + dir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\mpv\\Addons"; + + if (Directory.Exists(dir)) + foreach (string i in Directory.GetDirectories(dir)) + catalog.Catalogs.Add(new DirectoryCatalog(i, "*Addon.dll")); + + if (catalog.Catalogs.Count > 0) + { + CompositionContainer = new CompositionContainer(catalog); + CompositionContainer.ComposeParts(this); + } + } + catch (Exception e) + { + MsgException(e); } } } diff --git a/mpvnet/Command.cs b/mpvnet/Command.cs new file mode 100644 index 0000000..902f3fc --- /dev/null +++ b/mpvnet/Command.cs @@ -0,0 +1,103 @@ +/** + *mpv.net + *Copyright(C) 2017 stax76 + * + *This program is free software: you can redistribute it and/or modify + *it under the terms of the GNU General Public License as published by + *the Free Software Foundation, either version 3 of the License, or + *(at your option) any later version. + * + *This program is distributed in the hope that it will be useful, + *but WITHOUT ANY WARRANTY; without even the implied warranty of + *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the + *GNU General Public License for more details. + * + *You should have received a copy of the GNU General Public License + *along with this program. If not, see http://www.gnu.org/licenses/. + */ + +using System; +using System.Linq; +using System.Collections.Generic; +using System.IO; +using System.Windows.Forms; + +using vbnet; + +namespace mpvnet +{ + public class Command + { + public string Name { get; set; } + public Action Action { get; set; } + + private static List commands; + + public static List Commands + { + get + { + if (commands == null) + { + commands = new List(); + var type = typeof(Command); + var methods = type.GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public); + + foreach (var i in methods) + { + var parameters = i.GetParameters(); + + if (parameters == null || parameters.Length != 1 || parameters[0].ParameterType != typeof(string[])) + continue; + + var cmd = new Command() { Name = i.Name.Replace("_","-"), Action = (Action)i.CreateDelegate(typeof(Action)) }; + commands.Add(cmd); + } + } + + return commands; + } + } + + public static void open_files(string[] args) + { + MainForm.Instance.Invoke(new Action(() => { + using (var d = new OpenFileDialog()) + { + d.Multiselect = true; + d.Filter = Misc.GetFilter(Misc.FileTypes); + + if (d.ShowDialog() == DialogResult.OK) + mpv.LoadFiles(d.FileNames); + } + })); + } + + public static void open_config_folder(string[] args) + { + ProcessHelp.Start(Folder.AppDataRoaming + "mpv"); + } + + public static void show_keys(string[] args) + { + ProcessHelp.Start(OS.GetTextEditor(), '"' + mpv.InputConfPath + '"'); + } + + public static void show_prefs(string[] args) + { + string filepath = Folder.AppDataRoaming + "mpv\\mpv.conf"; + + if (!File.Exists(filepath)) + { + var dirPath = Folder.AppDataRoaming + "mpv\\"; + + if (!Directory.Exists(dirPath)) + Directory.CreateDirectory(dirPath); + + File.WriteAllText(filepath, "# https://mpv.io/manual/master/#configuration-files"); + } + + ProcessHelp.Start(OS.GetTextEditor(), '"' + filepath + '"'); + } + } +} \ No newline at end of file diff --git a/mpvnet/Extensions.cs b/mpvnet/Extensions.cs new file mode 100644 index 0000000..72a4a00 --- /dev/null +++ b/mpvnet/Extensions.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace mpvnet +{ + public static class Extensions + { + public static string Join(this IEnumerable instance, string delimiter, bool removeEmpty = false) + { + if (instance == null) + return null; + + bool containsEmpty = false; + + foreach (var i in instance) + { + if (string.IsNullOrEmpty(i)) + { + containsEmpty = true; + break; + } + } + + if (containsEmpty && removeEmpty) + instance = instance.Where(arg => !string.IsNullOrEmpty(arg)); + + return string.Join(delimiter, instance); + } + } +} \ No newline at end of file diff --git a/mpvnet/MainForm.Designer.cs b/mpvnet/MainForm.Designer.cs index a0053e3..069483d 100644 --- a/mpvnet/MainForm.Designer.cs +++ b/mpvnet/MainForm.Designer.cs @@ -42,11 +42,13 @@ // MainForm // this.AllowDrop = true; - this.AutoScaleDimensions = new System.Drawing.SizeF(19F, 37F); + this.AutoScaleDimensions = new System.Drawing.SizeF(20F, 48F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.BackColor = System.Drawing.Color.Black; - this.ClientSize = new System.Drawing.Size(1517, 951); + this.ClientSize = new System.Drawing.Size(1553, 1000); + this.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); this.Name = "MainForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "mpv.net"; diff --git a/mpvnet/MainForm.cs b/mpvnet/MainForm.cs index bf988d7..a9b310b 100644 --- a/mpvnet/MainForm.cs +++ b/mpvnet/MainForm.cs @@ -19,11 +19,16 @@ using System; using System.Diagnostics; using System.Drawing; +using System.IO; using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; +using vbnet; +using vbnet.UI; +using static vbnet.UI.MainModule; + namespace mpvnet { public partial class MainForm : Form @@ -33,8 +38,9 @@ namespace mpvnet private Point LastCursorPosChanged; private int LastCursorChangedTickCount; + private bool IsCloseRequired = true; - public ContextMenuEx CM; + public ContextMenuStripEx CMS; public MainForm() { @@ -50,10 +56,11 @@ namespace mpvnet mpv.VideoSizeChanged += Mpv_VideoSizeChanged; mpv.PlaybackRestart += Mpv_PlaybackRestart; - CM = new ContextMenuEx(); - ContextMenu = CM; - CM.Popup += CM_Popup; - ContextMenu.MenuItems.Add("About mpv.net", About); + ToolStripManager.Renderer = new ToolStripRendererEx(ToolStripRenderModeEx.SystemDefault); + CMS = new ContextMenuStripEx(components); + CMS.Opened += CMS_Opened; + ContextMenuStrip = CMS; + BuildMenu(); } catch (Exception e) { @@ -61,9 +68,60 @@ namespace mpvnet } } + public void BuildMenu() + { + if (!File.Exists(mpv.InputConfPath)) + { + var dirPath = Folder.AppDataRoaming + "mpv\\"; + + if (!Directory.Exists(dirPath)) + Directory.CreateDirectory(dirPath); + + File.WriteAllText(mpv.InputConfPath, Properties.Resources.input_conf); + } + + foreach (var i in File.ReadAllText(mpv.InputConfPath).SplitLinesNoEmpty()) + { + if (!i.Contains("#menu:")) + continue; + + var left = i.Left("#menu:").Trim(); + + if (left.StartsWith("#")) + continue; + + var cmd = left.Right(" ").Trim(); + var menu = i.Right("#menu:").Trim(); + var key = menu.Left(";").Trim(); + var path = menu.Right(";").Trim(); + + if (path == "" || cmd == "") + continue; + + var menuItem = CMS.Add(path, () => { + try + { + mpv.CommandString(cmd); + } + catch (Exception e) + { + MsgException(e); + } + }); + + if (menuItem != null) + menuItem.ShortcutKeyDisplayString = key.Replace("_","") + " "; + } + } + + private void CMS_Opened(object sender, EventArgs e) + { + CursorHelp.Show(); + } + private void Mpv_PlaybackRestart() { - BeginInvoke(new Action(() => Text = mpv.GetStringProp("filename") + " - mpv.net")); + BeginInvoke(new Action(() => Text = mpv.GetStringProp("filename") + " - mpv.net " + Application.ProductVersion)); } private void CM_Popup(object sender, EventArgs e) @@ -78,10 +136,10 @@ namespace mpvnet void HandleException(Exception e) { - MessageBox.Show(e.ToString(), "mpv.net Exception", MessageBoxButtons.OK, MessageBoxIcon.Error); + MsgException(e); } - private void About(object sender, EventArgs e) + private void About() { mpv.Command("show-text", Application.ProductName + " v" + Application.ProductVersion.ToString() + "\nCopyright (c) 2017 stax76\nGPL License", "5000"); @@ -92,7 +150,11 @@ namespace mpvnet BeginInvoke(new Action(() => SetFormPosSize())); } - private void Mpv_AfterShutdown() => Invoke(new Action(() => Close())); + private void Mpv_AfterShutdown() + { + if (IsCloseRequired) + Invoke(new Action(() => Close())); + } public bool IsFullscreen { @@ -189,20 +251,7 @@ namespace mpvnet base.OnDragDrop(e); if (e.Data.GetDataPresent(DataFormats.FileDrop)) - { - int count = mpv.GetIntProp("playlist-count"); - string[] files = e.Data.GetData(DataFormats.FileDrop) as String[]; - - foreach (string file in files) - mpv.Command("loadfile", file, "append"); - - mpv.SetIntProp("playlist-pos", count); - - for (int i = 0; i < count; i++) - mpv.Command("playlist-remove", "0"); - - mpv.LoadFolder(); - } + mpv.LoadFiles(e.Data.GetData(DataFormats.FileDrop) as String[]); } protected override void OnMouseDown(MouseEventArgs e) @@ -234,6 +283,7 @@ namespace mpvnet protected override void OnFormClosed(FormClosedEventArgs e) { base.OnFormClosed(e); + IsCloseRequired = false; mpv.Command("quit"); } @@ -251,7 +301,7 @@ namespace mpvnet } else if (Environment.TickCount - LastCursorChangedTickCount > 1500 && !IsMouseInOSC() && ClientRectangle.Contains(PointToClient(MousePosition)) && - Form.ActiveForm == this && !CM.Visible) + Form.ActiveForm == this && !CMS.Visible) { CursorHelp.Hide(); } diff --git a/mpvnet/Misc.cs b/mpvnet/Misc.cs index d5c9309..cd9aafa 100644 --- a/mpvnet/Misc.cs +++ b/mpvnet/Misc.cs @@ -4,6 +4,16 @@ using System.Runtime.InteropServices; namespace mpvnet { + public class Misc + { + public static readonly string[] FileTypes = "264 265 3gp aac ac3 avc avi avs bmp divx dts dtshd dtshr dtsma eac3 evo flac flv h264 h265 hevc hvc jpg jpeg m2t m2ts m2v m4a m4v mka mkv mlp mov mp2 mp3 mp4 mpa mpeg mpg mpv mts ogg ogm opus pcm png pva raw rmvb thd thd+ac3 true-hd truehd ts vdr vob vpy w64 wav webm wmv y4m".Split(' '); + + public static string GetFilter(IEnumerable values) + { + return "*." + values.Join(";*.") + "|*." + values.Join(";*.") + "|All Files|*.*"; + } + } + public class StringLogicalComparer : IComparer, IComparer { [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] diff --git a/mpvnet/Properties/AssemblyInfo.cs b/mpvnet/Properties/AssemblyInfo.cs index 9579ca2..e99e43d 100644 --- a/mpvnet/Properties/AssemblyInfo.cs +++ b/mpvnet/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.1.0.0")] -[assembly: AssemblyFileVersion("0.1.0.0")] +[assembly: AssemblyVersion("0.2.0.0")] +[assembly: AssemblyFileVersion("0.2.0.0")] diff --git a/mpvnet/Properties/Resources.Designer.cs b/mpvnet/Properties/Resources.Designer.cs index 585b220..44dbbf2 100644 --- a/mpvnet/Properties/Resources.Designer.cs +++ b/mpvnet/Properties/Resources.Designer.cs @@ -59,5 +59,26 @@ namespace mpvnet.Properties { resourceCulture = value; } } + + /// + /// Looks up a localized string similar to + ///#key command key caption menu path/caption + /// + ///o script-message mpv.net open-files #menu: O; Open Files + /// + ///Space pause #menu: Space ; Play/Pause + ///s stop #menu: S ; Stop + /// + ///F11 playlist-prev #menu: F11 ; Navigate | Previous + ///F12 playlist-next #menu: F12 ; Navigate | Next + /// + ///Ctrl++ add video-zoom 0.1 #menu: Ctrl++ ; Pan && Scan | Increase Size + ///Ctrl+- add video-zoom -0.1 #menu: Ct [rest of string was truncated]";. + /// + internal static string input_conf { + get { + return ResourceManager.GetString("input_conf", resourceCulture); + } + } } } diff --git a/mpvnet/Properties/Resources.resx b/mpvnet/Properties/Resources.resx index af7dbeb..39981e4 100644 --- a/mpvnet/Properties/Resources.resx +++ b/mpvnet/Properties/Resources.resx @@ -46,7 +46,7 @@ mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with - : System.Serialization.Formatters.Binary.BinaryFormatter + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 @@ -60,6 +60,7 @@ : and then encoded with base64 encoding. --> + @@ -68,9 +69,10 @@ - + + @@ -85,9 +87,10 @@ - + + @@ -109,9 +112,13 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\input_conf.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + \ No newline at end of file diff --git a/mpvnet/Resources/input_conf.txt b/mpvnet/Resources/input_conf.txt new file mode 100644 index 0000000..9b72de1 --- /dev/null +++ b/mpvnet/Resources/input_conf.txt @@ -0,0 +1,49 @@ + +#key command key caption menu path/caption + +o script-message mpv.net open-files #menu: O; Open Files + +Space pause #menu: Space ; Play/Pause +s stop #menu: S ; Stop + +F11 playlist-prev #menu: F11 ; Navigate | Previous +F12 playlist-next #menu: F12 ; Navigate | Next + +Ctrl++ add video-zoom 0.1 #menu: Ctrl++ ; Pan && Scan | Increase Size +Ctrl+- add video-zoom -0.1 #menu: Ctrl+- ; Pan && Scan | Decrease Size + +Enter cycle fullscreen #menu: Enter ; Cycle Fullscreen +KP7 cycle audio #menu: Numpad 7 ; Cycle Audio +KP8 cycle sub #menu: Numpad 8 ; Cycle Subtitle + ++ add volume 5 #menu: + ; Volume | Up +- add volume -5 #menu: - ; Volume | Down +Axis_Up add volume 5 # wheel up +Axis_Down add volume -5 # wheel down +_ _ #menu: _ ; Volume | - +m mute #menu: M ; Volume | Mute + +Alt++ add audio-delay 0.1 #menu: Alt++ ; Audio | Delay +0.1 +Alt+- add audio-delay -0.1 #menu: Alt+- ; Audio | Delay -0.1 + +Right seek 10 #menu: Right ; Seek | 10 sec forward +Left seek -10 #menu: Left ; Seek | 10 sec backward +_ _ #menu: _ ; Seek | - +Up seek 60 #menu: Up ; Seek | 1 min forward +Down seek -60 #menu: Down ; Seek | 1 min backward +_ _ #menu: _ ; Seek | - +Ctrl+Right seek 300 #menu: Ctrl+Right ; Seek | 5 min forward +Ctrl+Left seek -300 #menu: Ctrl+Left ; Seek | 5 min backward + +KP0 script-message rate-file 0 #menu: Numpad 0 ; Addons | Rating | 0stars +KP1 script-message rate-file 1 #menu: Numpad 1 ; Addons | Rating | 1stars +KP2 script-message rate-file 2 #menu: Numpad 2 ; Addons | Rating | 2stars +KP3 script-message rate-file 3 #menu: Numpad 3 ; Addons | Rating | 3stars +KP4 script-message rate-file 4 #menu: Numpad 4 ; Addons | Rating | 4stars +KP5 script-message rate-file 5 #menu: Numpad 5 ; Addons | Rating | 5stars + +p script-message mpv.net show-prefs #menu: P ; Preferences +k script-message mpv.net show-keys #menu: K ; Keys + +F8 script-message mpv.net open-config-folder #menu: _ ; Tools | Config Folder +Esc quit #menu: Escape ; Exit diff --git a/mpvnet/StringExtensions.cs b/mpvnet/StringExtensions.cs index 34f6a93..3afc4dd 100644 --- a/mpvnet/StringExtensions.cs +++ b/mpvnet/StringExtensions.cs @@ -16,31 +16,641 @@ *along with this program. If not, see http://www.gnu.org/licenses/. */ +using Microsoft.VisualBasic; +using System; +using System.Linq; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Diagnostics; +using System.Globalization; using System.IO; +using System.Runtime.CompilerServices; +using System.Text; -namespace mpvnet +public static class StringExtensions { - public static class ExtensionMethods + // public static string Multiply(this string instance, int multiplier) + // { + // StringBuilder sb = new StringBuilder(multiplier * instance.Length); + + // for (var i = 0; i <= multiplier - 1; i++) + // { + // sb.Append(instance); + // } + + // return sb.ToString(); + // } + + // public static bool IsValidFileName(string instance) + // { + // if (string.IsNullOrEmpty(instance)) + // return false; + + // string chars = "\"*/:<>?\\|"; + + // foreach (var i in instance) + // { + // if (chars.Contains(i.ToString())) + // return false; + + // if (Convert.ToInt32(i) < 32) + // return false; + // } + + // return true; + // } + + // [Extension()] + // public static string FileName(string instance) + // { + // if (string.IsNullOrEmpty(instance)) + // return ""; + // dynamic index = instance.LastIndexOf(Path.DirectorySeparatorChar); + // if (index > -1) + // return instance.Substring(index + 1); + // return instance; + // } + + // [Extension()] + // public static string Upper(string instance) + // { + // if (string.IsNullOrEmpty(instance)) + // return ""; + // return instance.ToUpperInvariant; + // } + + // [Extension()] + // public static string Lower(string instance) + // { + // if (string.IsNullOrEmpty(instance)) + // return ""; + // return instance.ToLowerInvariant; + // } + + // [Extension()] + // public static string ChangeExt(string instance, string value) + // { + // if (string.IsNullOrEmpty(instance)) + // return ""; + // if (string.IsNullOrEmpty(value)) + // return instance; + // if (!value.StartsWith(".")) + // value = "." + value; + // return instance.DirAndBase + value.ToLower; + // } + + // [Extension()] + // public static string Escape(string instance) + // { + // if (string.IsNullOrEmpty(instance)) + // return ""; + + // dynamic chars = " ()".ToCharArray; + + // foreach (void i_loopVariable in chars) + // { + // i = i_loopVariable; + // if (instance.Contains(i)) + // return "\"" + instance + "\""; + // } + + // return instance; + // } + + // [Extension()] + // public static string Parent(string instance) + // { + // return DirPath.GetParent(instance); + // } + + // [Extension()] + // public static string ExistingParent(string instance) + // { + // dynamic ret = instance.Parent; + // if (!Directory.Exists(ret)) + // ret = ret.Parent; + // else + // return ret; + // if (!Directory.Exists(ret)) + // ret = ret.Parent; + // else + // return ret; + // if (!Directory.Exists(ret)) + // ret = ret.Parent; + // else + // return ret; + // if (!Directory.Exists(ret)) + // ret = ret.Parent; + // else + // return ret; + // if (!Directory.Exists(ret)) + // ret = ret.Parent; + // else + // return ret; + // return ret; + // } + + public static string ExtFull(this string filepath) { - public static string Ext(this string instance) + return Ext(filepath, true); + } + + public static string Ext(this string filepath) + { + return Ext(filepath, false); + } + + public static string Ext(this string filepath, bool dot) + { + if (string.IsNullOrEmpty(filepath)) + return ""; + + var chars = filepath.ToCharArray(); + + for (var x = filepath.Length - 1; x >= 0; x += -1) { - if (string.IsNullOrEmpty(instance)) + if (chars[x] == Path.DirectorySeparatorChar) return ""; - string ext = Path.GetExtension(instance); - - if (ext == "") - return ""; - - return ext.ToLowerInvariant().Substring(1); + if (chars[x] == '.') + return filepath.Substring(x + (dot ? 0 : 1)).ToLower(); } - public static string ExtFull(this string instance) - { - if (string.IsNullOrEmpty(instance)) - return ""; + return ""; + } - return Path.GetExtension(instance).ToLowerInvariant(); - } + // [Extension()] + // public static string Base(string instance) + // { + // return FilePath.GetBase(instance); + // } + + // [Extension()] + // public static string Dir(string instance) + // { + // return FilePath.GetDir(instance); + // } + + // [Extension()] + // public static string DirName(string instance) + // { + // return DirPath.GetName(instance); + // } + + // [Extension()] + // public static string DirAndBase(string instance) + // { + // return FilePath.GetDirAndBase(instance); + // } + + // [Extension()] + // public static bool ContainsAll(string instance, IEnumerable all) + // { + // if (!string.IsNullOrEmpty(instance)) + // return all.All(arg => instance.Contains(arg)); + // } + + // [Extension()] + // public static bool ContainsAny(string instance, IEnumerable any) + // { + // if (!string.IsNullOrEmpty(instance)) + // return any.Any(arg => instance.Contains(arg)); + // } + + // [Extension()] + // public static string ToTitleCase(string value) + // { + // //TextInfo.ToTitleCase won't work on all upper strings + // return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(value.ToLower); + // } + + // [Extension()] + // public static bool IsInt(string value) + // { + // return int.TryParse(value, null); + // } + + // [Extension()] + // public static int ToInt(string value, int defaultValue = 0) + // { + // if (!int.TryParse(value, null)) + // return defaultValue; + // return Convert.ToInt32(value); + // } + + // [Extension()] + // public static bool IsSingle(string value) + // { + // if (!string.IsNullOrEmpty(value)) + // { + // if (value.Contains(",")) + // value = value.Replace(",", "."); + + // return float.TryParse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, null); + // } + // } + + // [Extension()] + // public static float ToSingle(string value, float defaultValue = 0) + // { + // if (!string.IsNullOrEmpty(value)) + // { + // if (value.Contains(",")) + // value = value.Replace(",", "."); + + // float ret = 0; + + // if (float.TryParse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, ret)) + // { + // return ret; + // } + // } + + // return defaultValue; + // } + + // [Extension()] + // public static bool IsDouble(string value) + // { + // if (!string.IsNullOrEmpty(value)) + // { + // if (value.Contains(",")) + // value = value.Replace(",", "."); + + // return double.TryParse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, null); + // } + // } + + // [Extension()] + // public static double ToDouble(string value, float defaultValue = 0) + // { + // if (!string.IsNullOrEmpty(value)) + // { + // if (value.Contains(",")) + // value = value.Replace(",", "."); + + // double ret = 0; + + // if (double.TryParse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, ret)) + // { + // return ret; + // } + // } + + // return defaultValue; + // } + + public static string Left(this string value, int index) + { + if (string.IsNullOrEmpty(value) || index < 0) + return ""; + + if (index > value.Length) + return value; + + return value.Substring(0, index); + } + + public static string Left(this string value, string start) + { + if (string.IsNullOrEmpty(value) || string.IsNullOrEmpty(start)) + return ""; + + if (!value.Contains(start)) + return ""; + + return value.Substring(0, value.IndexOf(start)); + } + + public static string LeftLast(this string value, string start) + { + if (!value.Contains(start)) + return ""; + + return value.Substring(0, value.LastIndexOf(start)); + } + + public static string Right(this string value, string start) + { + if (string.IsNullOrEmpty(value) || string.IsNullOrEmpty(start)) + return ""; + + if (!value.Contains(start)) + return ""; + + return value.Substring(value.IndexOf(start) + start.Length); + } + + public static string RightLast(this string value, string start) + { + if (string.IsNullOrEmpty(value) || string.IsNullOrEmpty(start)) + return ""; + + if (!value.Contains(start)) + return ""; + + return value.Substring(value.LastIndexOf(start) + start.Length); + } + + // [Extension()] + // public static bool EqualIgnoreCase(string a, string b) + // { + // if (string.IsNullOrEmpty(a) || string.IsNullOrEmpty(b)) + // return false; + // return string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0; + // } + + // [Extension()] + // public static string Shorten(string value, int maxLength) + // { + // if (string.IsNullOrEmpty(value) || value.Length <= maxLength) + // { + // return value; + // } + + // return value.Substring(0, maxLength); + // } + + public static string[] SplitNoEmpty(this string value, params string[] delimiters) + { + return value.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); + } + + public static string[] SplitKeepEmpty(this string value, params string[] delimiters) + { + return value.Split(delimiters, StringSplitOptions.None); + } + + public static string[] SplitNoEmptyAndWhiteSpace(this string value, params string[] delimiters) + { + if (string.IsNullOrEmpty(value)) + return null; + + var a = SplitNoEmpty(value, delimiters); + + for (var i = 0; i <= a.Length - 1; i++) + a[i] = a[i].Trim(); + + var l = a.ToList(); + + while (l.Contains("")) + l.Remove(""); + + return l.ToArray(); + } + + public static string[] SplitLinesNoEmpty(this string value) + { + return SplitNoEmpty(value, Environment.NewLine); + } + + // [Extension()] + // public static string RemoveChars(string value, string chars) + // { + // dynamic ret = value; + + // foreach (void i_loopVariable in value) + // { + // i = i_loopVariable; + // if (chars.IndexOf(i) >= 0) + // { + // ret = ret.Replace(i, ""); + // } + // } + + // return ret; + // } + + // [Extension()] + // public static string DeleteRight(string value, int count) + // { + // return Strings.Left(value, value.Length - count); + // } + + // [Extension()] + // public static string ReplaceUnicode(string value) + // { + // if (value.Contains(Convert.ToChar(0x2212))) + // { + // value = value.Replace(Convert.ToChar(0x2212), '-'); + // } + + // return value; + // } + + // [Extension()] + // public static void ToClipboard(string value) + // { + // if (!string.IsNullOrEmpty(value)) + // { + // Clipboard.SetText(value); + // } + // else + // { + // Clipboard.Clear(); + // } + // } + //} + + public class DirPath : PathBase + { + + // public static string TrimTrailingSeparator(string path) + // { + // if (string.IsNullOrEmpty(path)) + // return ""; + + // if (path.EndsWith(Separator) && !(path.Length <= 3)) + // { + // return path.TrimEnd(Separator); + // } + + // return path; + // } + + // public static string FixSeperator(string path) + // { + // if (path.Contains("\\") && Separator != "\\") + // { + // path = path.Replace("\\", Separator); + // } + + // if (path.Contains("/") && Separator != "/") + // { + // path = path.Replace("/", Separator); + // } + + // return path; + // } + + // public static string GetParent(string path) + // { + // if (string.IsNullOrEmpty(path)) + // return ""; + // dynamic temp = TrimTrailingSeparator(path); + // if (temp.Contains(Separator)) + // path = temp.LeftLast(Separator) + Separator; + // return path; + // } + + // public static string GetName(string path) + // { + // if (string.IsNullOrEmpty(path)) + // return ""; + // path = TrimTrailingSeparator(path); + // return path.RightLast(Separator); + // } + + // public static bool IsFixedDrive(string path) + // { + // try + // { + // if (!string.IsNullOrEmpty(path)) + // return new DriveInfo(path).DriveType == DriveType.Fixed; + // } + // catch (Exception ex) + // { + // } + // } + } + + public class FilePath : PathBase + { + + + // private string Value; + // public FilePath(string path) + // { + // Value = path; + // } + + // public static string GetDir(string path) + // { + // if (string.IsNullOrEmpty(path)) + // return ""; + // if (path.Contains("\\")) + // path = path.LeftLast("\\") + "\\"; + // return path; + // } + + // public static string GetDirAndBase(string path) + // { + // return GetDir(path) + GetBase(path); + // } + + // public static string GetName(string path) + // { + // if ((path != null)) + // { + // dynamic index = path.LastIndexOf(IO.Path.DirectorySeparatorChar); + + // if (index > -1) + // { + // return path.Substring(index + 1); + // } + // } + + // return path; + // } + + // public static string GetDirNoSep(string path) + // { + // path = GetDir(path); + // if (path.EndsWith(Separator)) + // path = TrimSep(path); + // return path; + // } + + // public static string GetBase(string path) + // { + // if (string.IsNullOrEmpty(path)) + // return ""; + // dynamic ret = path; + // if (ret.Contains(Separator)) + // ret = ret.RightLast(Separator); + // if (ret.Contains(".")) + // ret = ret.LeftLast("."); + // return ret; + // } + + // public static string TrimSep(string path) + // { + // if (string.IsNullOrEmpty(path)) + // return ""; + + // if (path.EndsWith(Separator) && !path.EndsWith(":" + Separator)) + // { + // return path.TrimEnd(Separator); + // } + + // return path; + // } + + // public static string GetDirNameOnly(string path) + // { + // return FilePath.GetDirNoSep(path).RightLast("\\"); + // } + } + + public class PathBase + { + //public static char Separator { + // get { return Path.DirectorySeparatorChar; } + //} + + // public static bool IsSameBase(string a, string b) + // { + // return FilePath.GetBase(a).EqualIgnoreCase(FilePath.GetBase(b)); + // } + + // public static bool IsSameDir(string a, string b) + // { + // return FilePath.GetDir(a).EqualIgnoreCase(FilePath.GetDir(b)); + // } + + // public static bool IsValidFileSystemName(string name) + // { + // if (string.IsNullOrEmpty(name)) + // return false; + // dynamic chars = "\"*/:<>?\\|^".ToCharArray; + + // foreach (void i_loopVariable in name.ToCharArray) + // { + // i = i_loopVariable; + // if (chars.Contains(i)) + // return false; + // if (Convert.ToInt32(i) < 32) + // return false; + // } + + // return true; + // } + + // public static string RemoveIllegalCharsFromName(string name) + // { + // if (string.IsNullOrEmpty(name)) + // return ""; + + // dynamic chars = "\"*/:<>?\\|^".ToCharArray; + + // foreach (void i_loopVariable in name.ToCharArray) + // { + // i = i_loopVariable; + // if (chars.Contains(i)) + // { + // name = name.Replace(i, "_"); + // } + // } + + // for (x = 1; x <= 31; x++) + // { + // if (name.Contains(Convert.ToChar(x))) + // { + // name = name.Replace(Convert.ToChar(x), '_'); + // } + // } + + // return name; } } \ No newline at end of file diff --git a/mpvnet/UI.cs b/mpvnet/UI.cs index f59f4b6..2dc0b9d 100644 --- a/mpvnet/UI.cs +++ b/mpvnet/UI.cs @@ -51,29 +51,4 @@ namespace mpvnet Math.Abs(screenPos.Y - Control.MousePosition.Y) > 10; } } - - public static class MsgBox - { - public static void MsgInfo(string text) - { - MessageBox.Show(text, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - public class ContextMenuEx : ContextMenu - { - public bool Visible { get ; set; } - - protected override void OnCollapse(EventArgs e) - { - base.OnCollapse(e); - Visible = false; - } - - protected override void OnPopup(EventArgs e) - { - base.OnPopup(e); - Visible = true; - } - } } \ No newline at end of file diff --git a/mpvnet/mpv.cs b/mpvnet/mpv.cs index 4ba6f11..866ea75 100644 --- a/mpvnet/mpv.cs +++ b/mpvnet/mpv.cs @@ -24,10 +24,13 @@ using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Collections.Generic; +using System.Drawing; using static mpvnet.libmpv; using static mpvnet.Native; -using System.Drawing; + +using vbnet; +using static vbnet.UI.MainModule; namespace mpvnet { @@ -47,6 +50,8 @@ namespace mpvnet public static Addon Addon; public static List> BoolPropChangeActions = new List>(); public static Size VideoSize; + public static string InputConfPath = Folder.AppDataRoaming + "mpv\\input.conf"; + public static StringPairList BindingList = new StringPairList(); public static void Init() { @@ -54,7 +59,6 @@ namespace mpvnet MpvHandle = mpv_create(); SetIntProp("input-ar-delay", 500); SetIntProp("input-ar-rate", 20); - SetIntProp("osd-duration", 3000); SetIntProp("volume", 50); SetStringProp("hwdec", "auto"); SetStringProp("input-default-bindings", "yes"); @@ -110,7 +114,14 @@ namespace mpvnet if (ClientMessage != null) { var client_messageData = (mpv_event_client_message)Marshal.PtrToStructure(evt.data, typeof(mpv_event_client_message)); - ClientMessage?.Invoke(NativeUtf8StrArray2ManagedStrArray(client_messageData.args, client_messageData.num_args)); + var args = NativeUtf8StrArray2ManagedStrArray(client_messageData.args, client_messageData.num_args); + + if (args != null && args.Length > 1 && args[0] == "mpv.net") + foreach (var i in mpvnet.Command.Commands) + if (args[1] == i.Name) + i.Action(args.Skip(2).ToArray()); + + ClientMessage?.Invoke(args); } break; @@ -151,7 +162,7 @@ namespace mpvnet int err = mpv_command_string(MpvHandle, command); if (err < 0) - throw new Exception($"{(mpv_error)err}"); + throw new Exception($"{(mpv_error)err}" + BR2 + command); } public static void SetStringProp(string name, string value, bool throwException = true) @@ -242,6 +253,21 @@ namespace mpvnet LoadFolder(); } + public static void LoadFiles(string[] files) + { + int count = mpv.GetIntProp("playlist-count"); + + foreach (string file in files) + mpv.Command("loadfile", file, "append"); + + mpv.SetIntProp("playlist-pos", count); + + for (int i = 0; i < count; i++) + mpv.Command("playlist-remove", "0"); + + mpv.LoadFolder(); + } + public static void LoadFolder() { if (GetIntProp("playlist-count") == 1) diff --git a/mpvnet/mpv.net.csproj b/mpvnet/mpv.net.csproj index d2571fb..ec582be 100644 --- a/mpvnet/mpv.net.csproj +++ b/mpvnet/mpv.net.csproj @@ -104,6 +104,8 @@ + + Form @@ -113,11 +115,11 @@ + - MainForm.cs @@ -148,7 +150,16 @@ + + + + + {af1b21c5-28fc-4d47-ad0b-54f6a38391a6} + vbnet + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/vbnet/My Project/Settings.Designer.vb b/vbnet/My Project/Settings.Designer.vb new file mode 100644 index 0000000..4aaa63e --- /dev/null +++ b/vbnet/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.vbnet.My.MySettings + Get + Return Global.vbnet.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/vbnet/My Project/Settings.settings b/vbnet/My Project/Settings.settings new file mode 100644 index 0000000..85b890b --- /dev/null +++ b/vbnet/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/vbnet/Native.vb b/vbnet/Native.vb new file mode 100644 index 0000000..7f1451d --- /dev/null +++ b/vbnet/Native.vb @@ -0,0 +1,278 @@ +Imports System.Runtime.InteropServices +Imports System.Text + +Public Class Native + Public Delegate Function CallbackHandler(handle As IntPtr, parameter As Integer) As Boolean + + + Public Shared Function ExcludeClipRect(hdc As IntPtr, nLeftRect As Integer, nTopRect As Integer, nRightRect As Integer, nBottomRect As Integer) As Integer + End Function + +#Region "Constants" + + Friend Const EM_SETCUEBANNER As Integer = &H1501 + Friend Const CB_SETCUEBANNER As Integer = &H1703 + +#End Region + +#Region "Function" + +#Region "user32.dll" + + Shared Function SetWindowPos(hWnd As IntPtr, + hWndInsertAfter As IntPtr, + X As Integer, + Y As Integer, + cx As Integer, + cy As Integer, + uFlags As UInteger) As Boolean + End Function + + + Shared Function GetWindowLong(hWnd As IntPtr, nIndex As Integer) As Integer + End Function + + + Shared Function RegisterWindowMessage(id As String) As Integer + End Function + + + Shared Function RegisterHotKey(hWnd As IntPtr, id As Integer, fsModifiers As Integer, vk As Integer) As Boolean + End Function + + + Shared Function MapVirtualKey(wCode As Integer, wMapType As Integer) As Integer + End Function + + + Shared Function UnregisterHotKey(hWnd As IntPtr, id As Integer) As Boolean + End Function + + + Shared Function GetForegroundWindow() As IntPtr + End Function + + + Shared Function GetWindowThreadProcessId(hwnd As IntPtr, ByRef lpdwProcessId As Integer) As Integer + End Function + + + Shared Function SetForegroundWindow(handle As IntPtr) As Boolean + End Function + + + Shared Function GetWindowModuleFileName(hwnd As IntPtr, + lpszFileName As StringBuilder, + cchFileNameMax As UInteger) As UInteger + End Function + + + Shared Function SendMessage(handle As IntPtr, + message As Int32, + wParam As IntPtr, + lParam As IntPtr) As IntPtr + End Function + + + Shared Function SendMessage(hWnd As IntPtr, + Msg As Int32, + wParam As IntPtr, + lParam As String) As IntPtr + End Function + + + Shared Function SendMessage(hWnd As IntPtr, + Msg As Int32, + wParam As Integer, + lParam As Integer) As IntPtr + End Function + + + Shared Function SendMessage(hWnd As IntPtr, + Msg As Int32, + wParam As Integer, + lParam As String) As IntPtr + End Function + + + Shared Function SendMessage(hWnd As IntPtr, + Msg As Int32, + ByRef wParam As IntPtr, + lParam As StringBuilder) As IntPtr + End Function + + + Shared Function SendMessageTimeout(windowHandle As IntPtr, + msg As Integer, + wParam As IntPtr, + lParam As IntPtr, + flags As Integer, + timeout As Integer, + ByRef result As IntPtr) As IntPtr + End Function + + + Shared Function PostMessage(hwnd As IntPtr, + wMsg As Integer, + wParam As IntPtr, + lParam As IntPtr) As IntPtr + End Function + + + Shared Sub ReleaseCapture() + End Sub + + + Public Shared Function GetWindowRect(hWnd As IntPtr, ByRef lpRect As RECT) As Boolean + End Function + + + Public Shared Function GetWindowDC(hWnd As IntPtr) As IntPtr + End Function + + + Public Shared Function ReleaseDC(hWnd As IntPtr, hDC As IntPtr) As Integer + End Function + +#End Region + +#Region "kernel32.dll" + + + Shared Function LoadLibrary(path As String) As IntPtr + End Function + + + Shared Function FreeLibrary(hModule As IntPtr) As Boolean + End Function + + + Shared Function FormatMessage(dwFlags As Integer, + lpSource As IntPtr, + dwMessageId As Integer, + dwLanguageId As Integer, + ByRef lpBuffer As String, + nSize As Integer, + Arguments As IntPtr) As Integer + End Function + +#End Region + + + Shared Function SetWindowTheme(hWnd As IntPtr, + pszSubAppName As String, + pszSubIdList As String) As Integer + End Function + + + Shared Function AssocQueryString( + flags As UInteger, + str As UInteger, + pszAssoc As String, + pszExtra As String, + pszOut As StringBuilder, + ByRef pcchOut As UInteger) As UInteger + End Function + +#End Region + +#Region "Structures" + + Public Structure RECT + Public Left As Integer + Public Top As Integer + Public Right As Integer + Public Bottom As Integer + + Sub New(r As Rectangle) + Left = r.Left + Top = r.Top + Right = r.Right + Bottom = r.Bottom + End Sub + + Public Sub New(left As Integer, top As Integer, right As Integer, bottom As Integer) + Me.Left = left + Me.Top = top + Me.Right = right + Me.Bottom = bottom + End Sub + + Function ToRectangle() As Rectangle + Return Rectangle.FromLTRB(Left, Top, Right, Bottom) + End Function + End Structure + + Public Structure SHFILEINFO + Public hIcon As IntPtr + Public iIcon As Integer + Public dwAttributes As Integer + + Public szDisplayName As String + + Public szTypeName As String + End Structure + + Public Structure NMHDR + Public hwndFrom As Integer + Public idFrom As Integer + Public code As Integer + End Structure + + Public Structure NCCALCSIZE_PARAMS + Public rgrc0, rgrc1, rgrc2 As RECT + Public lppos As IntPtr + End Structure + +#End Region + +End Class + +Public Class Taskbar + Private Taskbar As ITaskbarList3 = DirectCast(New TaskBarCommunication(), ITaskbarList3) + + Property Handle As IntPtr + + Public Sub New(handle As IntPtr) + Me.Handle = handle + End Sub + + + + + Private Interface ITaskbarList3 + 'ITaskbarList + Sub HrInit() + Sub AddTab(hwnd As IntPtr) + Sub DeleteTab(hwnd As IntPtr) + Sub ActivateTab(hwnd As IntPtr) + Sub SetActiveAlt(hwnd As IntPtr) + 'ITaskbarList2 + Sub MarkFullscreenWindow(hwnd As IntPtr, fFullscreen As Boolean) + 'ITaskbarList3 + Sub SetProgressValue(hwnd As IntPtr, ullCompleted As UInt64, ullTotal As UInt64) + Sub SetProgressState(hwnd As IntPtr, state As TaskbarStates) + End Interface + + + + + Private Class TaskBarCommunication + End Class + + Public Sub SetState(taskbarState As TaskbarStates) + Taskbar.SetProgressState(Handle, taskbarState) + End Sub + + Public Sub SetValue(progressValue As Double, progressMax As Double) + Taskbar.SetProgressValue(Handle, CULng(Math.Truncate(progressValue)), CULng(Math.Truncate(progressMax))) + End Sub +End Class + +Public Enum TaskbarStates + NoProgress = 0 + Indeterminate = &H1 + Normal = &H2 + [Error] = &H4 + Paused = &H8 +End Enum \ No newline at end of file diff --git a/vbnet/TaskDialog.vb b/vbnet/TaskDialog.vb new file mode 100644 index 0000000..2f3bf9e --- /dev/null +++ b/vbnet/TaskDialog.vb @@ -0,0 +1,551 @@ +Imports System.Runtime.InteropServices +Imports System.Text +Imports System.Text.RegularExpressions + +Namespace UI + Public Delegate Function PFTASKDIALOGCALLBACK(hwnd As IntPtr, + msg As UInteger, + wParam As IntPtr, + lParam As IntPtr, + lpRefData As IntPtr) As Integer + Public Class TaskDialog(Of T) + Inherits TaskDialog + Implements IDisposable + + Private IdValueDic As New Dictionary(Of Integer, T) + Private IdTextDic As New Dictionary(Of Integer, String) + Private CommandLinkShieldList As New List(Of Integer) + Private ButtonArray As IntPtr, RadioButtonArray As IntPtr + Private Buttons As New List(Of TASKDIALOG_BUTTON) + Private RadioButtons As New List(Of TASKDIALOG_BUTTON) + + Private Config As TASKDIALOGCONFIG + + Sub New() + Config = New TASKDIALOGCONFIG() + + Config.cbSize = CUInt(Marshal.SizeOf(Config)) + Config.hwndParent = GetHandle() + Config.hInstance = IntPtr.Zero + Config.dwFlags = Flags.TDF_ALLOW_DIALOG_CANCELLATION + Config.dwCommonButtons = TaskDialogButtons.None + Config.MainIcon = New TASKDIALOGCONFIG_ICON_UNION(0) + Config.FooterIcon = New TASKDIALOGCONFIG_ICON_UNION(0) + Config.cxWidth = 0 + + Config.cButtons = 0 + Config.cRadioButtons = 0 + Config.pButtons = IntPtr.Zero + Config.pRadioButtons = IntPtr.Zero + Config.nDefaultButton = 0 + Config.nDefaultRadioButton = 0 + + Config.pszWindowTitle = Application.ProductName + Config.pszMainInstruction = "" + Config.pszContent = "" + Config.pszVerificationText = Nothing + Config.pszExpandedInformation = Nothing + Config.pszExpandedControlText = Nothing + Config.pszCollapsedControlText = Nothing + Config.pszFooter = Nothing + + Config.pfCallback = New PFTASKDIALOGCALLBACK(AddressOf DialogProc) + End Sub + + Function GetHandle() As IntPtr + Dim r As New StringBuilder(260) + Dim h = GetForegroundWindow() + GetWindowModuleFileName(h, r, 260) + If r.ToString.Replace(".vshost", "").Base = Application.ExecutablePath.Base Then Return h + End Function + +#Region "Constants" + Const TDE_CONTENT As Integer = 0 + Const TDE_EXPANDED_INFORMATION As Integer = 1 + Const TDE_FOOTER As Integer = 2 + Const TDE_MAIN_INSTRUCTION As Integer = 3 + + Const TDN_CREATED As Integer = 0 + Const TDN_NAVIGATED As Integer = 1 + Const TDN_BUTTON_CLICKED As Integer = 2 + Const TDN_HYPERLINK_CLICKED As Integer = 3 + Const TDN_TIMER As Integer = 4 + Const TDN_DESTROYED As Integer = 5 + Const TDN_RADIO_BUTTON_CLICKED As Integer = 6 + Const TDN_DIALOG_CONSTRUCTED As Integer = 7 + Const TDN_VERIFICATION_CLICKED As Integer = 8 + Const TDN_HELP As Integer = 9 + Const TDN_EXPANDO_BUTTON_CLICKED As Integer = 10 + + Const TDM_NAVIGATE_PAGE As Integer = &H400 + 101 + Const TDM_CLICK_BUTTON As Integer = &H400 + 102 'wParam = Button ID + Const TDM_SET_MARQUEE_PROGRESS_BAR As Integer = &H400 + 103 'wParam = 0 (nonMarque) wParam != 0 (Marquee) + Const TDM_SET_PROGRESS_BAR_STATE As Integer = &H400 + 104 'wParam = new progress state + Const TDM_SET_PROGRESS_BAR_RANGE As Integer = &H400 + 105 'lParam = MAKELPARAM(nMinRange, nMaxRange) + Const TDM_SET_PROGRESS_BAR_POS As Integer = &H400 + 106 'wParam = new position + Const TDM_SET_PROGRESS_BAR_MARQUEE As Integer = &H400 + 107 'wParam = 0 (stop marquee), wParam != 0 (start marquee), lparam = speed (milliseconds between repaints) + Const TDM_SET_ELEMENT_TEXT As Integer = &H400 + 108 'wParam = element (TASKDIALOG_ELEMENTS), lParam = new element text (LPCWSTR) + Const TDM_CLICK_RADIO_BUTTON As Integer = &H400 + 110 'wParam = Radio Button ID + Const TDM_ENABLE_BUTTON As Integer = &H400 + 111 'lParam = 0 (disable), lParam != 0 (enable), wParam = Button ID + Const TDM_ENABLE_RADIO_BUTTON As Integer = &H400 + 112 'lParam = 0 (disable), lParam != 0 (enable), wParam = Radio Button ID + Const TDM_CLICK_VERIFICATION As Integer = &H400 + 113 'wParam = 0 (unchecked), 1 (checked), lParam = 1 (set key focus) + Const TDM_UPDATE_ELEMENT_TEXT As Integer = &H400 + 114 'wParam = element (TASKDIALOG_ELEMENTS), lParam = new element text (LPCWSTR) + Const TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE As Integer = &H400 + 115 'wParam = Button ID, lParam = 0 (elevation not required), lParam != 0 (elevation required) + Const TDM_UPDATE_ICON As Integer = &H400 + 116 'wParam = icon element (TASKDIALOG_ICON_ELEMENTS), lParam = new icon (hIcon if TDF_USE_HICON_* was set, PCWSTR otherwise) +#End Region + +#Region "Properties" + + Private AllowCancelValue As Boolean + + WriteOnly Property AllowCancel() As Boolean + Set(Value As Boolean) + If Value Then + Config.dwFlags = Config.dwFlags Or Flags.TDF_ALLOW_DIALOG_CANCELLATION + ElseIf (Config.dwFlags And Flags.TDF_ALLOW_DIALOG_CANCELLATION) = Flags.TDF_ALLOW_DIALOG_CANCELLATION Then + Config.dwFlags = Config.dwFlags Xor Flags.TDF_ALLOW_DIALOG_CANCELLATION + End If + End Set + End Property + + Property MainInstruction() As String + Get + Return Config.pszMainInstruction + End Get + Set(Value As String) + Config.pszMainInstruction = Value + End Set + End Property + + Property Content() As String + Get + Return Config.pszContent + End Get + Set(Value As String) + Config.pszContent = ExpandWikiMarkup(Value) + End Set + End Property + + Property ExpandedInformation() As String + Get + Return Config.pszExpandedInformation + End Get + Set(Value As String) + Config.pszExpandedInformation = ExpandWikiMarkup(Value) + End Set + End Property + + Property VerificationText() As String + Get + Return Config.pszVerificationText + End Get + Set(Value As String) + Config.pszVerificationText = Value + End Set + End Property + + Property DefaultButton() As DialogResult + Get + Return CType(Config.nDefaultButton, DialogResult) + End Get + Set(Value As DialogResult) + Config.nDefaultButton = Value + End Set + End Property + + Property Footer() As String + Get + Return Config.pszFooter + End Get + Set(Value As String) + Config.pszFooter = ExpandWikiMarkup(Value) + End Set + End Property + + WriteOnly Property MainIcon() As TaskDialogIcon + Set(Value As TaskDialogIcon) + Config.MainIcon = New TASKDIALOGCONFIG_ICON_UNION(Value) + End Set + End Property + + Private SelectedIDValue As Integer = -1 + + Property SelectedID As Integer + Get + Return SelectedIDValue + End Get + Set(value As Integer) + For Each i In IdValueDic + If i.Key = value Then SelectedIDValue = value + Next + End Set + End Property + + Private SelectedValueValue As T + + Property SelectedValue() As T + Get + If IdValueDic.ContainsKey(SelectedID) Then Return IdValueDic(SelectedID) + Return SelectedValueValue + End Get + Set(value As T) + SelectedValueValue = value + End Set + End Property + + Private SelectedTextValue As String + + Property SelectedText() As String + Get + If IdTextDic.ContainsKey(SelectedID) Then Return IdTextDic(SelectedID) + Return SelectedTextValue + End Get + Set(value As String) + SelectedTextValue = value + End Set + End Property + + Property CheckBoxChecked() As Boolean + Get + Return (Config.dwFlags And Flags.TDF_VERIFICATION_FLAG_CHECKED) = Flags.TDF_VERIFICATION_FLAG_CHECKED + End Get + Set(value As Boolean) + If value Then + Config.dwFlags = Config.dwFlags Or Flags.TDF_VERIFICATION_FLAG_CHECKED + ElseIf CheckBoxChecked Then + Config.dwFlags = Config.dwFlags Xor Flags.TDF_VERIFICATION_FLAG_CHECKED + End If + End Set + End Property + + Private CommonButtonsValue As TaskDialogButtons + + Property CommonButtons() As TaskDialogButtons + Get + Return Config.dwCommonButtons + End Get + Set(Value As TaskDialogButtons) + Config.dwCommonButtons = Value + End Set + End Property + + Private TimeoutValue As Integer + + Property Timeout As Integer + Get + Return CInt(TimeoutValue / 1000) + End Get + Set(Value As Integer) + TimeoutValue = Value * 1000 + + If Value > 0 Then + Config.dwFlags = Config.dwFlags Or Flags.TDF_CALLBACK_TIMER + End If + End Set + End Property +#End Region + +#Region "Methods" + + Sub AddButton(text As String, value As T) + Dim id = 1000 + IdValueDic.Count + 1 + IdValueDic(id) = value + Buttons.Add(New TASKDIALOG_BUTTON(id, text)) + End Sub + + Function ExpandWikiMarkup(value As String) As String + If value.Contains("[") Then + Dim re As New Regex("\[(\w+?:.*?) (.+?)\]") + Dim m = re.Match(value) + + If m.Success Then + Config.dwFlags = Config.dwFlags Or Flags.TDF_ENABLE_HYPERLINKS + value = re.Replace(value, "$2") + End If + End If + + Return value + End Function + + Sub AddCommandLink(text As String, value As T) + Dim id = 1000 + IdValueDic.Count + 1 + IdValueDic(id) = value + IdTextDic(id) = text + Buttons.Add(New TASKDIALOG_BUTTON(id, text)) + Config.dwFlags = Config.dwFlags Or Flags.TDF_USE_COMMAND_LINKS + End Sub + + Sub AddCommandLink(text As String, + description As String, + value As T, + Optional setShield As Boolean = False) + + Dim id = 1000 + IdValueDic.Count + 1 + IdValueDic(id) = value + If setShield Then CommandLinkShieldList.Add(id) + If description <> "" Then text = text + BR + description + Buttons.Add(New TASKDIALOG_BUTTON(id, text)) + Config.dwFlags = Config.dwFlags Or Flags.TDF_USE_COMMAND_LINKS + End Sub + + Sub AddRadioButton(text As String, value As T) + Dim id = 1000 + IdValueDic.Count + 1 + IdValueDic(id) = value + RadioButtons.Add(New TASKDIALOG_BUTTON(id, text)) + End Sub + + Function Show() As T + MarshalDialogControlStructs() + Dim isChecked As Boolean + Dim hr = TaskDialogIndirect(Config, Nothing, Nothing, isChecked) + CheckBoxChecked = isChecked + If hr < 0 Then Marshal.ThrowExceptionForHR(hr) + If TypeOf SelectedValue Is DialogResult Then SelectedValue = DirectCast(CObj(SelectedID), T) + Return SelectedValue + End Function + + Private ExitTickCount As Integer + + Private Function DialogProc(hwnd As IntPtr, + msg As UInteger, + wParam As IntPtr, + lParam As IntPtr, + lpRefData As IntPtr) As Integer + Select Case msg + Case TDN_BUTTON_CLICKED, TDN_RADIO_BUTTON_CLICKED + If TypeOf SelectedValue Is DialogResult Then + SelectedIDValue = wParam.ToInt32 + Else + SelectedID = wParam.ToInt32 + End If + Case TDN_TIMER + If ExitTickCount = 0 Then + ExitTickCount = Environment.TickCount + Timeout * 1000 + End If + + If Environment.TickCount > ExitTickCount Then + SendMessage(hwnd, TDM_CLICK_BUTTON, DialogResult.OK, 0) + End If + Case TDN_HYPERLINK_CLICKED + Dim url = Marshal.PtrToStringUni(lParam) + + If url.StartsWith("mailto:") OrElse url Like "http*://*" Then + ProcessHelp.Start(url) + ElseIf url = "copymsg:" Then + Clipboard.SetText(MainInstruction + BR2 + Content + BR2 + ExpandedInformation) + MsgBox("Message was copied to clipboard.", MessageBoxIcon.Information) + End If + Case TDN_CREATED + For Each i In CommandLinkShieldList + SendMessage(hwnd, TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE, i, 1) + Next + End Select + + Return 0 + End Function + + Private Sub MarshalDialogControlStructs() + If Not Buttons Is Nothing AndAlso Buttons.Count > 0 Then + ButtonArray = AllocateAndMarshalButtons(Buttons) + Config.pButtons = ButtonArray + Config.cButtons = CUInt(Buttons.Count) + End If + + If Not RadioButtons Is Nothing AndAlso RadioButtons.Count > 0 Then + RadioButtonArray = AllocateAndMarshalButtons(RadioButtons) + Config.pRadioButtons = RadioButtonArray + Config.cRadioButtons = CUInt(RadioButtons.Count) + End If + End Sub + + Private Shared Function AllocateAndMarshalButtons(structs As List(Of TASKDIALOG_BUTTON)) As IntPtr + Dim initialPtr = Marshal.AllocHGlobal(Marshal.SizeOf(GetType(TASKDIALOG_BUTTON)) * structs.Count) + Dim currentPtr = initialPtr + + For Each button In structs + Marshal.StructureToPtr(button, currentPtr, False) + currentPtr = CType((currentPtr.ToInt64 + Marshal.SizeOf(button)), IntPtr) + Next + + Return initialPtr + End Function + +#End Region + +#Region "IDispose Pattern" + + Private disposed As Boolean + + Sub Dispose() Implements IDisposable.Dispose + Dispose(True) + GC.SuppressFinalize(Me) + End Sub + + Protected Overrides Sub Finalize() + Try + Dispose(False) + Finally + MyBase.Finalize() + End Try + End Sub + + Protected Sub Dispose(disposing As Boolean) + If Not disposed Then + disposed = True + + If ButtonArray <> IntPtr.Zero Then + Marshal.FreeHGlobal(ButtonArray) + ButtonArray = IntPtr.Zero + End If + + If RadioButtonArray <> IntPtr.Zero Then + Marshal.FreeHGlobal(RadioButtonArray) + RadioButtonArray = IntPtr.Zero + End If + + If disposing Then + End If + End If + End Sub + +#End Region + + End Class + + Public Class TaskDialog + + Shared Function TaskDialogIndirect(<[In]()> pTaskConfig As TASKDIALOGCONFIG, + ByRef pnButton As Integer, + ByRef pnRadioButton As Integer, + ByRef pVerificationFlagChecked As Boolean) As Integer + End Function + + + Shared Function GetForegroundWindow() As IntPtr + End Function + + + Shared Function GetWindowModuleFileName(hwnd As IntPtr, + lpszFileName As StringBuilder, + cchFileNameMax As UInteger) As UInteger + End Function + + + Shared Function SendMessage(hWnd As IntPtr, + Msg As Int32, + wParam As Integer, + lParam As Integer) As IntPtr + End Function + + + Public Class TASKDIALOGCONFIG + Public cbSize As UInteger + Public hwndParent As IntPtr + Public hInstance As IntPtr + Public dwFlags As Flags + Public dwCommonButtons As TaskDialogButtons + + Public pszWindowTitle As String + Public MainIcon As TASKDIALOGCONFIG_ICON_UNION + + Public pszMainInstruction As String + + Public pszContent As String + Public cButtons As UInteger + Public pButtons As IntPtr + Public nDefaultButton As Integer + Public cRadioButtons As UInteger + Public pRadioButtons As IntPtr + Public nDefaultRadioButton As Integer + + Public pszVerificationText As String + + Public pszExpandedInformation As String + + Public pszExpandedControlText As String + + Public pszCollapsedControlText As String + Public FooterIcon As TASKDIALOGCONFIG_ICON_UNION + + Public pszFooter As String + Public pfCallback As PFTASKDIALOGCALLBACK + Public lpCallbackData As IntPtr + Public cxWidth As UInteger + End Class + + 'TASKDIALOG_FLAGS + Public Enum Flags + NONE = 0 + TDF_ENABLE_HYPERLINKS = &H1 + TDF_USE_HICON_MAIN = &H2 + TDF_USE_HICON_FOOTER = &H4 + TDF_ALLOW_DIALOG_CANCELLATION = &H8 + TDF_USE_COMMAND_LINKS = &H10 + TDF_USE_COMMAND_LINKS_NO_ICON = &H20 + TDF_EXPAND_FOOTER_AREA = &H40 + TDF_EXPANDED_BY_DEFAULT = &H80 + TDF_VERIFICATION_FLAG_CHECKED = &H100 + TDF_SHOW_PROGRESS_BAR = &H200 + TDF_SHOW_MARQUEE_PROGRESS_BAR = &H400 + TDF_CALLBACK_TIMER = &H800 + TDF_POSITION_RELATIVE_TO_WINDOW = &H1000 + TDF_RTL_LAYOUT = &H2000 + TDF_NO_DEFAULT_RADIO_BUTTON = &H4000 + End Enum + + + Public Structure TASKDIALOGCONFIG_ICON_UNION + Sub New(i As Integer) + spacer = IntPtr.Zero + pszIcon = 0 + hMainIcon = i + End Sub + + + Public hMainIcon As Integer + + Public pszIcon As Integer + + Public spacer As IntPtr + End Structure + + + Public Structure TASKDIALOG_BUTTON + Sub New(n As Integer, txt As String) + nButtonID = n + pszButtonText = txt + End Sub + + Public nButtonID As Integer + + Public pszButtonText As String + End Structure + End Class + + Public Enum TaskDialogButtons + None = &H0 + Ok = &H1 + Yes = &H2 + No = &H4 + Cancel = &H8 + Retry = &H10 + RetryCancel = Retry Or Cancel + Close = &H20 + OkCancel = Ok Or Cancel + YesNo = Yes Or No + YesNoCancel = YesNo Or Cancel + End Enum + + Public Enum TaskDialogIcon + Warning = 65535 'TD_WARNING_ICON + [Error] = 65534 'TD_ERROR_ICON + Info = 65533 'TD_INFORMATION_ICON + Shield = 65532 'TD_SHIELD_ICON + SecurityShieldBlue = 65531 + SecurityWarning = 65530 + SecurityError = 65529 + SecuritySuccess = 65528 + SecurityShieldGray = 65527 + End Enum +End Namespace \ No newline at end of file diff --git a/vbnet/ToolStripRendererEx.vb b/vbnet/ToolStripRendererEx.vb new file mode 100644 index 0000000..ba81620 --- /dev/null +++ b/vbnet/ToolStripRendererEx.vb @@ -0,0 +1,311 @@ +Imports System.Drawing.Drawing2D +Imports System.Drawing.Text +Imports Microsoft.Win32 + +Namespace UI + Public Class ToolStripRendererEx + Inherits ToolStripSystemRenderer + + Shared RenderMode As ToolStripRenderModeEx + + Shared Property ColorChecked As Color + Shared Property ColorBorder As Color + Shared Property ColorTop As Color + Shared Property ColorBottom As Color + Shared Property ColorBackground As Color + + Shared Property ColorToolStrip1 As Color + Shared Property ColorToolStrip2 As Color + Shared Property ColorToolStrip3 As Color + Shared Property ColorToolStrip4 As Color + + Private TextOffset As Integer + + Sub New(mode As ToolStripRenderModeEx) + RenderMode = mode + InitColors(mode) + End Sub + + Shared Function IsAutoRenderMode() As Boolean + Return _ + RenderMode = ToolStripRenderModeEx.SystemAuto OrElse + RenderMode = ToolStripRenderModeEx.Win7Auto OrElse + RenderMode = ToolStripRenderModeEx.Win10Auto + End Function + + Shared Sub InitColors(renderMode As ToolStripRenderModeEx) + If ToolStripRendererEx.IsAutoRenderMode Then + Dim argb = CInt(Registry.GetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM", "ColorizationColor", 0)) + If argb = 0 Then argb = Color.LightBlue.ToArgb + InitColors(Color.FromArgb(argb)) + Else + ColorBorder = Color.FromArgb(&HFF83ABDC) + ColorTop = Color.FromArgb(&HFFE7F0FB) + ColorBottom = Color.FromArgb(&HFFCCE1FB) + ColorBackground = SystemColors.Control + + ColorToolStrip1 = Color.FromArgb(&HFFFDFEFF) + ColorToolStrip2 = Color.FromArgb(&HFFE6F0FA) + ColorToolStrip3 = Color.FromArgb(&HFFDCE6F4) + ColorToolStrip4 = Color.FromArgb(&HFFDDE9F7) + End If + End Sub + + Shared Sub InitColors(c As Color) + ColorBorder = HSLColor.Convert(c).ToColorSetLuminosity(100) + ColorChecked = HSLColor.Convert(c).ToColorSetLuminosity(200) + ColorBottom = HSLColor.Convert(c).ToColorSetLuminosity(220) + ColorBackground = HSLColor.Convert(c).ToColorSetLuminosity(230) + ColorTop = HSLColor.Convert(c).ToColorSetLuminosity(240) + + ColorToolStrip1 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 1))) + ColorToolStrip2 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 0.7))) + ColorToolStrip3 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 0.1))) + ColorToolStrip4 = ControlPaint.LightLight(ControlPaint.LightLight(ControlPaint.Light(ColorBorder, 0.4))) + End Sub + + Protected Overrides Sub OnRenderToolStripBorder(e As ToolStripRenderEventArgs) + ControlPaint.DrawBorder(e.Graphics, e.AffectedBounds, Color.FromArgb(160, 175, 195), ButtonBorderStyle.Solid) + End Sub + + Protected Overloads Overrides Sub OnRenderItemText(e As ToolStripItemTextRenderEventArgs) + e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias + + If TypeOf e.Item Is ToolStripMenuItem AndAlso Not TypeOf e.Item.Owner Is MenuStrip Then + Dim r = e.TextRectangle + + Dim dropDown = TryCast(e.ToolStrip, ToolStripDropDownMenu) + + If dropDown Is Nothing OrElse dropDown.ShowImageMargin OrElse dropDown.ShowCheckMargin Then + TextOffset = CInt(e.Item.Height * 1.1) + Else + TextOffset = CInt(e.Item.Height * 0.2) + End If + + e.TextRectangle = New Rectangle(TextOffset, CInt((e.Item.Height - r.Height) / 2), r.Width, r.Height) + End If + + MyBase.OnRenderItemText(e) + End Sub + + Protected Overrides Sub OnRenderToolStripBackground(e As ToolStripRenderEventArgs) + If Not TypeOf e.ToolStrip Is ToolStripDropDownMenu AndAlso + Not e.ToolStrip.LayoutStyle = ToolStripLayoutStyle.VerticalStackWithOverflow Then + + Dim r As New Rectangle(-1, -1, e.AffectedBounds.Width, e.AffectedBounds.Height) + + If IsFlat() Then + Using b As New SolidBrush(ColorToolStrip2) + e.Graphics.FillRectangle(b, r) + End Using + Else + Dim cb As New ColorBlend() + cb.Colors = {ColorToolStrip1, ColorToolStrip2, ColorToolStrip3, ColorToolStrip4} + cb.Positions = {0.0F, 0.5F, 0.5F, 1.0F} + + Using b As New LinearGradientBrush(r, ColorToolStrip1, ColorToolStrip4, 90) + b.InterpolationColors = cb + e.Graphics.FillRectangle(b, r) + End Using + End If + End If + End Sub + + Protected Overrides Sub OnRenderMenuItemBackground(e As ToolStripItemRenderEventArgs) + e.Item.ForeColor = Color.Black + + Dim left = 22 + Dim r = New Rectangle(Point.Empty, e.Item.Size) + Dim g = e.Graphics + + If Not TypeOf e.Item.Owner Is MenuStrip Then + g.Clear(ColorBackground) + End If + + If e.Item.Selected AndAlso e.Item.Enabled Then + If TypeOf e.Item.Owner Is MenuStrip Then + DrawButton(e) + Else + g.SmoothingMode = SmoothingMode.AntiAlias + + Dim r2 = New Rectangle(r.X + 2, r.Y, r.Width - 4, r.Height - 1) + + If IsFlat() Then + Using pen As New Pen(ColorBorder) + g.DrawRectangle(pen, r2) + End Using + + r2.Inflate(-1, -1) + + Using b As New SolidBrush(ColorBottom) + g.FillRectangle(b, r2) + End Using + Else + Using path = CreateRoundRectangle(r2, 3) + Using b As New LinearGradientBrush(r2, + ControlPaint.LightLight(ControlPaint.LightLight(ColorTop)), + ControlPaint.LightLight(ControlPaint.LightLight(ColorBottom)), + 90.0F) + g.FillPath(b, path) + End Using + + Using p As New Pen(ColorBorder) + g.DrawPath(p, path) + End Using + End Using + + r2.Inflate(-1, -1) + + Using path = CreateRoundRectangle(r2, 3) + Using b As New LinearGradientBrush(r2, ColorTop, ColorBottom, 90.0F) + g.FillPath(b, path) + End Using + End Using + End If + End If + End If + End Sub + + Sub DrawButton(e As ToolStripItemRenderEventArgs) + Dim g = e.Graphics + Dim r = New Rectangle(Point.Empty, e.Item.Size) + Dim r2 = New Rectangle(r.X, r.Y, r.Width - 1, r.Height - 1) + + If IsFlat() Then + Using pen As New Pen(ColorBorder) + g.DrawRectangle(pen, r2) + End Using + + r2.Inflate(-1, -1) + + Dim tsb = TryCast(e.Item, ToolStripButton) + + If Not tsb Is Nothing AndAlso tsb.Checked Then + Using brush As New SolidBrush(ColorChecked) + g.FillRectangle(brush, r2) + End Using + Else + Using brush As New SolidBrush(ColorBottom) + g.FillRectangle(brush, r2) + End Using + End If + Else + g.SmoothingMode = SmoothingMode.AntiAlias + + Dim c1 = HSLColor.Convert(ColorToolStrip1).ToColorAddLuminosity(15) + Dim c2 = HSLColor.Convert(ColorToolStrip2).ToColorAddLuminosity(15) + Dim c3 = HSLColor.Convert(ColorToolStrip3).ToColorAddLuminosity(15) + Dim c4 = HSLColor.Convert(ColorToolStrip4).ToColorAddLuminosity(15) + + Dim cb As New ColorBlend() + + cb.Colors = {c1, c2, c3, c4} + cb.Positions = {0.0F, 0.5F, 0.5F, 1.0F} + + Using path = CreateRoundRectangle(r2, 3) + Using b As New LinearGradientBrush(r2, c1, c4, 90) + b.InterpolationColors = cb + g.FillPath(b, path) + End Using + + Using p As New Pen(ColorBorder) + g.DrawPath(p, path) + End Using + End Using + + r2.Inflate(-1, -1) + + c1 = HSLColor.Convert(ColorToolStrip1).ToColorAddLuminosity(5) + c2 = HSLColor.Convert(ColorToolStrip2).ToColorAddLuminosity(5) + c3 = HSLColor.Convert(ColorToolStrip3).ToColorAddLuminosity(-10) + c4 = HSLColor.Convert(ColorToolStrip4).ToColorAddLuminosity(-10) + + cb.Colors = {c1, c2, c3, c4} + cb.Positions = {0.0F, 0.5F, 0.5F, 1.0F} + + Using b As New LinearGradientBrush(r2, c1, c4, 90) + b.InterpolationColors = cb + + Using path = CreateRoundRectangle(r2, 3) + g.FillPath(b, path) + End Using + End Using + End If + End Sub + + Protected Overrides Sub OnRenderDropDownButtonBackground(e As ToolStripItemRenderEventArgs) + If e.Item.Selected Then DrawButton(e) + End Sub + + Protected Overrides Sub OnRenderButtonBackground(e As ToolStripItemRenderEventArgs) + Dim button = DirectCast(e.Item, ToolStripButton) + If e.Item.Selected OrElse button.Checked Then DrawButton(e) + End Sub + + Protected Overloads Overrides Sub OnRenderArrow(e As ToolStripArrowRenderEventArgs) + Dim value = If(e.Direction = ArrowDirection.Down, &H36, &H34) + Dim s = Convert.ToChar(value).ToString + Dim font = New Font("Marlett", e.Item.Font.Size - 2) + Dim size = e.Graphics.MeasureString(s, font) + Dim x = CInt(e.Item.Width - size.Width) + Dim y = CInt((e.Item.Height - size.Height) / 2) + 1 + e.Graphics.DrawString(s, font, Brushes.Black, x, y) + End Sub + + Protected Overrides Sub OnRenderItemCheck(e As ToolStripItemImageRenderEventArgs) + Dim x = CInt(e.ImageRectangle.Height * 0.2) + e.Graphics.DrawImage(e.Image, New Point(x, x)) + End Sub + + Protected Overloads Overrides Sub OnRenderSeparator(e As ToolStripSeparatorRenderEventArgs) + If e.Item.IsOnDropDown Then + e.Graphics.Clear(ColorBackground) + Dim right = e.Item.Width - CInt(TextOffset / 5) + Dim top = e.Item.Height \ 2 + top -= 1 + Dim b = e.Item.Bounds + + Using p As New Pen(Color.Gray) + e.Graphics.DrawLine(p, New Point(TextOffset, top), New Point(right, top)) + End Using + ElseIf e.Vertical Then + Dim b = e.Item.Bounds + + Using p As New Pen(SystemColors.ControlDarkDark) + e.Graphics.DrawLine(p, CInt(b.Width / 2), CInt(b.Height * 0.15), CInt(b.Width / 2), CInt(b.Height * 0.85)) + End Using + End If + End Sub + + Public Shared Function CreateRoundRectangle(r As Rectangle, radius As Integer) As GraphicsPath + Dim path As New GraphicsPath() + + Dim l = r.Left + Dim t = r.Top + Dim w = r.Width + Dim h = r.Height + Dim d = radius << 1 + + path.AddArc(l, t, d, d, 180, 90) + path.AddLine(l + radius, t, l + w - radius, t) + path.AddArc(l + w - d, t, d, d, 270, 90) + path.AddLine(l + w, t + radius, l + w, t + h - radius) + path.AddArc(l + w - d, t + h - d, d, d, 0, 90) + path.AddLine(l + w - radius, t + h, l + radius, t + h) + path.AddArc(l, t + h - d, d, d, 90, 90) + path.AddLine(l, t + h - radius, l, t + radius) + path.CloseFigure() + + Return path + End Function + + Shared Function IsFlat() As Boolean + If RenderMode = ToolStripRenderModeEx.Win10Default Then Return True + If RenderMode = ToolStripRenderModeEx.Win10Auto Then Return True + + If (RenderMode = ToolStripRenderModeEx.SystemDefault OrElse + RenderMode = ToolStripRenderModeEx.SystemAuto) AndAlso + OSVersion.Current >= OSVersion.Windows8 Then Return True + End Function + End Class +End Namespace diff --git a/vbnet/UI.vb b/vbnet/UI.vb new file mode 100644 index 0000000..3435b64 --- /dev/null +++ b/vbnet/UI.vb @@ -0,0 +1,2108 @@ +Imports System.Drawing.Text +Imports System.IO + +Namespace UI + Public Class ImageHelp + Private Shared Coll As PrivateFontCollection + Private Shared AwesomePath As String = Folder.Startup + "FontAwesome.ttf" + Private Shared SegoePath As String = Folder.Startup + "Segoe-MDL2-Assets.ttf" + Private Shared FontFilesExist As Boolean = File.Exists(AwesomePath) AndAlso File.Exists(SegoePath) + + Shared Async Function GetSymbolImageAsync(symbol As Symbol) As Task(Of Image) + Return Await Task.Run(Of Image)(Function() GetSymbolImage(symbol)) + End Function + + Shared Function GetSymbolImage(symbol As Symbol) As Image + If Not FontFilesExist Then Return Nothing + Dim legacy = OSVersion.Current < OSVersion.Windows10 + + If Coll Is Nothing Then + Coll = New PrivateFontCollection + Coll.AddFontFile(AwesomePath) + If legacy Then Coll.AddFontFile(SegoePath) + End If + + Dim family As FontFamily + + If CInt(symbol) > 61400 Then + If Coll.Families.Count > 0 Then family = Coll.Families(0) + Else + If legacy Then + If Coll.Families.Count > 1 Then family = Coll.Families(1) + Else + family = New FontFamily("Segoe MDL2 Assets") + End If + End If + + If family Is Nothing Then Return Nothing + Dim font As New Font(family, 12) + Dim fontHeight = font.Height + Dim bitmap As New Bitmap(CInt(fontHeight * 1.1F), CInt(fontHeight * 1.1F)) + Dim graphics = Drawing.Graphics.FromImage(bitmap) + 'graphics.Clear(Color.Orange) + graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAlias + graphics.DrawString(Convert.ToChar(CInt(symbol)), font, Brushes.Black, -fontHeight * 0.1F, fontHeight * 0.07F) + graphics.Dispose() + font.Dispose() + + Return bitmap + End Function + End Class + + Public Enum Symbol + None = 0 + [Error] = &HE783 + [Like] = &HE8E1 + [Next] = &HE893 + [Stop] = &HE71A + Accept = &HE8FB + AcceptLegacy = &HE10B + Accident = &HE81F + AccidentSolid = &HEA8E + Accounts = &HE910 + AccountsLegacy = &HE168 + ActionCenter = &HE91C + ActionCenterAsterisk = &HEA21 + ActionCenterMirrored = &HED0D + ActionCenterNotification = &HE7E7 + ActionCenterNotificationMirrored = &HED0C + ActionCenterQuiet = &HEE79 + ActionCenterQuietNotification = &HEE7A + Add = &HE710 + AddFriend = &HE8FA + AddFriendLegacy = &HE1E2 + AddLegacy = &HE109 + AddRemoteDevice = &HE836 + AddSurfaceHub = &HECC4 + AddTo = &HECC8 + AdjustHologram = &HEBD2 + Admin = &HE7EF + AdminLegacy = &HE1A7 + Airplane = &HE709 + AirplaneSolid = &HEB4C + AlignCenter = &HE8E3 + AlignCenterLegacy = &HE1A1 + AlignLeft = &HE8E4 + AlignLeftLegacy = &HE1A2 + AlignRight = &HE8E2 + AlignRightLegacy = &HE1A0 + AllApps = &HE71D + AllAppsLegacy = &HE179 + AllAppsLegacyMirrored = &HE1EC + AllAppsMirrored = &HEA40 + Annotation = &HE924 + AppIconDefault = &HECAA + ArrowHTMLLegacy = &HED5 + ArrowHTMLLegacyMirrored = &HEAE + AspectRatio = &HE799 + Asterisk = &HEA38 + AsteriskBadge12 = &HEDAD + Attach = &HE723 + AttachCamera = &HE8A2 + AttachCameraLegacy = &HE12D + AttachLegacy = &HE16C + Audio = &HE8D6 + AudioLegacy = &HE189 + Back = &HE72B + BackBttnArrow20Legacy = &HEC4 + BackBttnArrow42Legacy = &HEA6 + BackBttnMirroredArrow20Legacy = &HEAD + BackBttnMirroredArrow42Legacy = &HEAB + BackgroundToggle = &HEF1F + BackLegacy = &HE112 + BackSpaceQWERTY = &HE750 + BackSpaceQWERTYLg = &HEB96 + BackSpaceQWERTYMd = &HE926 + BackSpaceQWERTYSm = &HE925 + BackToWindow = &HE73F + BackToWindowLegacy = &HE1D8 + Badge = &HEC1B + Bank = &HE825 + BarcodeScanner = &HEC5A + Battery0 = &HE850 + Battery1 = &HE851 + Battery10 = &HE83F + Battery2 = &HE852 + Battery3 = &HE853 + Battery4 = &HE854 + Battery5 = &HE855 + Battery6 = &HE856 + Battery7 = &HE857 + Battery8 = &HE858 + Battery9 = &HE859 + BatteryCharging0 = &HE85A + BatteryCharging1 = &HE85B + BatteryCharging10 = &HEA93 + BatteryCharging2 = &HE85C + BatteryCharging3 = &HE85D + BatteryCharging4 = &HE85E + BatteryCharging5 = &HE85F + BatteryCharging6 = &HE860 + BatteryCharging7 = &HE861 + BatteryCharging8 = &HE862 + BatteryCharging9 = &HE83E + BatterySaver0 = &HE863 + BatterySaver1 = &HE864 + BatterySaver10 = &HEA95 + BatterySaver2 = &HE865 + BatterySaver3 = &HE866 + BatterySaver4 = &HE867 + BatterySaver5 = &HE868 + BatterySaver6 = &HE869 + BatterySaver7 = &HE86A + BatterySaver8 = &HE86B + BatterySaver9 = &HEA94 + BatteryUnknown = &HE996 + Beta = &HEA24 + BidiLtr = &HE9AA + BidiRtl = &HE9AB + BlockContact = &HE8F8 + BlockContactLegacy = &HE1E0 + BlockedLegacy = &HE25B + Bluetooth = &HE702 + BodyCam = &HEC80 + Bold = &HE8DD + BoldFLegacy = &HE1B3 + BoldGLegacy = &HE1B1 + BoldKoreanLegacy = &HE1BD + BoldLegacy = &HE19B + BoldNLegacy = &HE1B7 + BoldRussionLegacy = &HE1B9 + Bookmarks = &HE8A4 + BookmarksLegacy = &HE12F + BookmarksLegacyMirrored = &HE1EE + BookmarksMirrored = &HEA41 + Brightness = &HE706 + Broom = &HEA99 + BrowsePhotos = &HE7C5 + BrowsePhotosLegacy = &HE155 + BrushSize = &HEDA8 + BuildingEnergy = &HEC0B + BulletedList = &HE8FD + BulletedListLegacy = &HE292 + BulletedListLegacyMirrored = &HE299 + BulletedListMirrored = &HEA42 + Bus = &HE806 + BusSolid = &HEB47 + Calculator = &HE8EF + CalculatorAddition = &HE948 + CalculatorBackspace = &HE94F + CalculatorDivide = &HE94A + CalculatorEqualTo = &HE94E + CalculatorLegacy = &HE1D0 + CalculatorMultiply = &HE947 + CalculatorNegate = &HE94D + CalculatorPercentage = &HE94C + CalculatorSquareroot = &HE94B + CalculatorSubtract = &HE949 + Calendar = &HE787 + CalendarDay = &HE8BF + CalendarDayLegacy = &HE161 + CalendarLegacy = &HE163 + CalendarLegacyMirrored = &HE1DC + CalendarMirrored = &HED28 + CalendarReply = &HE8F5 + CalendarReplyLegacy = &HE1DB + CalendarSolid = &HEA89 + CalendarWeek = &HE8C0 + CalendarWeekLegacy = &HE162 + CaligraphyPen = &HEDFB + CallForwarding = &HE7F2 + CallForwardingMirrored = &HEA97 + CallForwardInternational = &HE87A + CallForwardInternationalMirrored = &HEA43 + CallForwardRoaming = &HE87B + CallForwardRoamingMirrored = &HEA44 + Camera = &HE722 + CameraLegacy = &HE114 + Cancel = &HE711 + CancelLegacy = &HE10A + Caption = &HE8BA + CaptionLegacy = &HE15A + Car = &HE804 + CashDrawer = &HEC59 + CC = &HE7F0 + CCEuroLegacy = &HE18F + CCJapanLegacy = &HE18E + CCLegacy = &HE190 + CellPhone = &HE8EA + CellPhoneLegacy = &HE1C9 + Certificate = &HEB95 + Characters = &HE8C1 + CharactersLegacy = &HE164 + ChatBubbles = &HE8F2 + Checkbox = &HE739 + CheckboxComposite = &HE73A + CheckboxCompositeLegacy = &HEA2 + CheckboxCompositeReversed = &HE73D + CheckboxCompositeReversedLegacy = &HE5 + CheckboxFill = &HE73B + CheckboxFillLegacy = &HE2 + CheckboxFillZeroWidthLegacy = &HE9 + CheckboxIndeterminate = &HE73C + CheckboxIndeterminateLegacy = &HE4 + CheckboxLegacy = &HE3 + CheckMark = &HE73E + CheckMarkLegacy = &HE1 + CheckmarkListviewLegacy = &HE81 + CheckmarkMenuLegacy = &HEE7 + CheckMarkZeroWidthLegacy = &HE8 + ChevronDown = &HE70D + ChevronDown1Legacy = &HE99 + ChevronDown2Legacy = &HE9D + ChevronDown3Legacy = &HE15 + ChevronDown4Legacy = &HEA1 + ChevronDownMed = &HE972 + ChevronDownSmall = &HE96E + ChevronDownSmLegacy = &HE228 + ChevronFlipDownLegacy = &HEE5 + ChevronFlipLeftLegacy = &HEE2 + ChevronFlipRightLegacy = &HEE3 + ChevronFlipUpLegacy = &HEE4 + ChevronLeft = &HE76B + ChevronLeft1Legacy = &HE96 + ChevronLeft2Legacy = &HE9A + ChevronLeft3Legacy = &HE12 + ChevronLeft4Legacy = &HE9E + ChevronLeftMed = &HE973 + ChevronLeftSmall = &HE96F + ChevronLeftSmLegacy = &HE26C + ChevronRight = &HE76C + ChevronRight1Legacy = &HE97 + ChevronRight2Legacy = &HE9B + ChevronRight3Legacy = &HE13 + ChevronRight4Legacy = &HE9F + ChevronRightMed = &HE974 + ChevronRightSmall = &HE970 + ChevronRightSmLegacy = &HE26B + ChevronUp = &HE70E + ChevronUp1Legacy = &HE98 + ChevronUp2Legacy = &HE9C + ChevronUp3Legacy = &HE14 + ChevronUp4Legacy = &HEA0 + ChevronUpMed = &HE971 + ChevronUpSmall = &HE96D + ChineseBoPoMoFo = &HE989 + ChineseChangjie = &HE981 + ChinesePinyin = &HE98A + ChineseQuick = &HE984 + ChromeAnnotate = &HE931 + ChromeBack = &HE830 + ChromeBackMirrored = &HEA47 + ChromeBackToWindow = &HE92C + ChromeClose = &HE8BB + ChromeFullScreen = &HE92D + ChromeMaximize = &HE922 + ChromeMinimize = &HE921 + ChromeRestore = &HE923 + CircleFill = &HEA3B + CircleFillBadge12 = &HEDB0 + CircleRing = &HEA3A + CircleRingBadge12 = &HEDAF + CityNext = &HEC06 + CityNext2 = &HEC07 + Clear = &HE894 + ClearAllInk = &HED62 + ClearAllInkMirrored = &HEF19 + ClearLegacy = &HE106 + ClearSelection = &HE8E6 + ClearSelectionLegacy = &HE1C5 + ClearSelectionLegacyMirrored = &HE1F4 + ClearSelectionMirrored = &HEA48 + Click = &HE8B0 + ClockLegacy = &HE121 + ClosePane = &HE89F + ClosePaneLegacy = &HE126 + ClosePaneLegacyMirrored = &HE1BF + ClosePaneMirrored = &HEA49 + Cloud = &HE753 + CloudPrinter = &HEDA6 + Code = &HE943 + Color = &HE790 + ColorLegacy = &HE2B1 + CommaKey = &HE9AD + CommandPrompt = &HE756 + Comment = &HE90A + CommentInlineLegacy = &HE206 + CommentLegacy = &HE134 + Communications = &HE95A + CompanionApp = &HEC64 + CompanionDeviceFramework = &HED5D + Completed = &HE930 + CompletedSolid = &HEC61 + Component = &HE950 + Connect = &HE703 + ConnectApp = &HED5C + Construction = &HE822 + ConstructionCone = &HE98F + ConstructionSolid = &HEA8D + Contact = &HE77B + Contact2 = &HE8D4 + Contact2Legacy = &HE187 + Contact3Legacy = &HE2AF + ContactInfo = &HE779 + ContactInfoLegacy = &HE136 + ContactInfoMirrored = &HEA4A + ContactLegacy = &HE13D + ContactPresence = &HE8CF + ContactPresenceLegacy = &HE181 + ContactSolid = &HEA8C + Copy = &HE8C8 + CopyLegacy = &HE16F + Courthouse = &HEC08 + Crop = &HE7A8 + CropLegacy = &HE123 + Cut = &HE8C6 + CutLegacy = &HE16B + DashKey = &HE9AE + DataSense = &HE791 + DataSenseBar = &HE7A5 + DateTime = &HEC92 + DateTimeMirrored = &HEE93 + DecreaseIndentLegacy = &HE290 + DecreaseIndentLegacyMirrored = &HE297 + DefenderApp = &HE83D + Delete = &HE74D + DeleteLegacy = &HE107 + DeveloperTools = &HEC7A + DeviceDiscovery = &HEBDE + DeviceLaptopNoPic = &HE7F8 + DeviceLaptopPic = &HE7F7 + DeviceMonitorLeftPic = &HE7FA + DeviceMonitorNoPic = &HE7FB + DeviceMonitorRightPic = &HE7F9 + Devices = &HE772 + Devices2 = &HE975 + Devices3 = &HEA6C + Devices4 = &HEB66 + DevicesLegacy = &HE212 + DevUpdate = &HECC5 + Diagnostic = &HE9D9 + Dialpad = &HE75F + DialUp = &HE83C + Dictionary = &HE82D + DictionaryAdd = &HE82E + DictionaryCloud = &HEBC3 + DirectAccess = &HE83B + Directions = &HE8F0 + DirectionsLegacy = &HE1D1 + DisableUpdates = &HE8D8 + DisableUpdatesLegacy = &HE194 + DisconnectDisplay = &HEA14 + DisconnectDrive = &HE8CD + DisconnectDriveLegacy = &HE17A + Dislike = &HE8E0 + DislikeLegacy = &HE19E + DMC = &HE951 + Dock = &HE952 + DockBottom = &HE90E + DockBottomLegacy = &HE147 + DockLeft = &HE90C + DockLeftLegacy = &HE145 + DockLeftLegacyMirrored = &HE1AB + DockLeftMirrored = &HEA4C + DockRight = &HE90D + DockRightLegacy = &HE146 + DockRightLegacyMirrored = &HE1AC + DockRightMirrored = &HEA4B + Document = &HE8A5 + DocumentLegacy = &HE130 + Down = &HE74B + DownLegacy = &HE1FD + Download = &HE896 + DownloadLegacy = &HE118 + DownloadMap = &HE826 + DownShiftKey = &HE84A + Draw = &HEC87 + DrawSolid = &HEC88 + DrivingMode = &HE7EC + Drop = &HEB42 + DullSound = &HE911 + DullSoundKey = &HE9AF + EaseOfAccess = &HE776 + EaseOfAccessLegacy = &HE7F + Edit = &HE70F + EditLegacy = &HE104 + EditLegacyMirrored = &HE1C2 + EditMirrored = &HEB7E + Education = &HE7BE + Emoji = &HE899 + Emoji2 = &HE76E + Emoji2Legacy = &HE170 + EmojiLegacy = &HE11D + EmojiSwatch = &HED5B + EmojiTabCelebrationObjects = &HED55 + EmojiTabFavorites = &HED5A + EmojiTabFoodPlants = &HED56 + EmojiTabPeople = &HED53 + EmojiTabSmilesAnimals = &HED54 + EmojiTabSymbols = &HED58 + EmojiTabTextSmiles = &HED59 + EmojiTabTransitPlaces = &HED57 + EndPoint = &HE81B + EndPointSolid = &HEB4B + EraseTool = &HE75C + EraseToolFill = &HE82B + EraseToolFill2 = &HE82C + ErrorBadge = &HEA39 + ErrorBadge12 = &HEDAE + eSIM = &HED2A + eSIMBusy = &HED2D + eSIMLocked = &HED2C + eSIMNoProfile = &HED2B + Ethernet = &HE839 + EthernetError = &HEB55 + EthernetWarning = &HEB56 + ExpandTile = &HE976 + ExpandTileLegacy = &HE13F + ExpandTileLegacyMirrored = &HE176 + ExpandTileMirrored = &HEA4E + ExploreContent = &HECCD + Export = &HEDE1 + ExportMirrored = &HEDE2 + FastForward = &HEB9D + Favorite2Legacy = &HE249 + FavoriteInlineLegacy = &HE208 + FavoriteLegacy = &HE113 + FavoriteList = &HE728 + FavoriteStar = &HE734 + FavoriteStarFill = &HE735 + Feedback = &HED15 + FeedbackApp = &HE939 + Ferry = &HE7E3 + FerrySolid = &HEB48 + FileExplorer = &HEC50 + FileExplorerApp = &HEC51 + Filter = &HE71C + FilterLegacy = &HE16E + FindLegacy = &HE11A + FingerInking = &HED5F + Fingerprint = &HE928 + Flag = &HE7C1 + FlagLegacy = &HE129 + Flashlight = &HE754 + FlickDown = &HE935 + FlickLeft = &HE937 + FlickRight = &HE938 + FlickUp = &HE936 + Folder = &HE8B7 + FolderFill = &HE8D5 + FolderLegacy = &HE188 + Font = &HE8D2 + FontColor = &HE8D3 + FontColorKoreanLegacy = &HE1BE + FontColorLegacy = &HE186 + FontDecrease = &HE8E7 + FontDecreaseLegacy = &HE1C6 + FontIncrease = &HE8E8 + FontIncreaseLegacy = &HE1C7 + FontLegacy = &HE185 + FontSize = &HE8E9 + FontSizeLegacy = &HE1C8 + FontStyleKoreanLegacy = &HE1BA + Forward = &HE72A + ForwardLegacy = &HE111 + ForwardSm = &HE9AC + FourBars = &HE908 + FourBarsLegacy = &HE1E9 + Frigid = &HE9CA + FullAlpha = &HE97F + FullCircleMask = &HE91F + FullHiragana = &HE986 + FullKatakana = &HE987 + FullScreen = &HE740 + FullScreenLegacy = &HE1D9 + Game = &HE7FC + GameConsole = &HE967 + GlobalNavButton = &HE700 + Globe = &HE774 + GlobeLegacy = &HE12B + Go = &HE8AD + GoLegacy = &HE143 + GoLegacyMirrored = &HE1AA + GoMirrored = &HEA4F + GoToStart = &HE8FC + GoToStartLegacy = &HE1E4 + GotoToday = &HE8D1 + GotoTodayLegacy = &HE184 + GripperBarHorizontal = &HE76F + GripperBarVertical = &HE784 + GripperResize = &HE788 + GripperResizeMirrored = &HEA50 + GripperTool = &HE75E + Groceries = &HEC09 + GuestUser = &HEE57 + HalfAlpha = &HE97E + HalfDullSound = &HE9B0 + HalfKatakana = &HE988 + HalfStarLeft = &HE7C6 + HalfStarRight = &HE7C7 + Handwriting = &HE929 + HangUp = &HE778 + HangUpLegacy = &HE137 + HardDrive = &HEDA2 + Headphone = &HE7F6 + Headphone0 = &HED30 + Headphone1 = &HED31 + Headphone2 = &HED32 + Headphone3 = &HED33 + Headset = &HE95B + Health = &HE95E + Heart = &HEB51 + HeartBroken = &HEA92 + HeartBrokenLegacy = &HE7 + HeartBrokenZeroWidthLegacy = &HEC + HeartFill = &HEB52 + HeartFillLegacy = &HEA5 + HeartFillZeroWidthLegacy = &HEB + HeartLegacy = &HE6 + Help = &HE897 + HelpLegacy = &HE11B + HelpLegacyMirrored = &HE1F3 + HelpMirrored = &HEA51 + HideBcc = &HE8C5 + HideBccLegacy = &HE16A + Highlight = &HE7E6 + HighlightFill = &HE891 + HighlightFill2 = &HE82A + HighlightLegacy = &HE193 + History = &HE81C + Home = &HE80F + HomeGroup = &HEC26 + HomeLegacy = &HE10F + HomeSolid = &HEA8A + HorizontalTabKey = &HE7FD + IBeam = &HE933 + IBeamOutline = &HE934 + ImageExport = &HEE71 + Import = &HE8B5 + ImportAll = &HE8B6 + ImportAllLegacy = &HE151 + ImportAllLegacyMirrored = &HE1AE + ImportAllMirrored = &HEA53 + Important = &HE8C9 + ImportantBadge12 = &HEDB1 + ImportantLegacy = &HE171 + ImportLegacy = &HE150 + ImportLegacyMirrored = &HE1AD + ImportMirrored = &HEA52 + IncidentTriangle = &HE814 + IncreaseIndentLegacy = &HE291 + IncreaseIndentLegacyMirrored = &HE298 + Info = &HE946 + Info2 = &HEA1F + InkingCaret = &HED65 + InkingColorFill = &HED67 + InkingColorOutline = &HED66 + InkingTool = &HE76D + InkingToolFill = &HE88F + InkingToolFill2 = &HE829 + InPrivate = &HE727 + Input = &HE961 + InsiderHubApp = &HEC24 + InternetSharing = &HE704 + Italic = &HE8DB + ItalicCLegacy = &HE1B0 + ItalicILegacy = &HE1B6 + ItalicKLegacy = &HE1B4 + ItalicKoreanLegacy = &HE1BC + ItalicLegacy = &HE199 + ItalicRussianLegacy = &HE1EA + Japanese = &HE985 + JpnRomanji = &HE87C + JpnRomanjiLock = &HE87D + JpnRomanjiShift = &HE87E + JpnRomanjiShiftLock = &HE87F + Key12On = &HE980 + KeyboardBrightness = &HED39 + KeyboardClassic = &HE765 + KeyboardDismiss = &HE92F + KeyboardFull = &HEC31 + KeyboardLeftHanded = &HE763 + KeyBoardLegacy = &HE144 + KeyboardLowerBrightness = &HED3A + KeyboardOneHanded = &HED4C + KeyboardRightHanded = &HE764 + KeyboardShortcut = &HEDA7 + KeyboardSplit = &HE766 + KeyboardSplitLegacy = &HE8F + KeyboardStandard = &HE92E + KeyboardStandardLegacy = &HE87 + Korean = &HE97D + Label = &HE932 + LangJPN = &HE7DE + LanguageChs = &HE88D + LanguageCht = &HE88C + LanguageJpn = &HEC45 + LanguageKor = &HE88B + LaptopSelected = &HEC76 + LayoutLegacy = &HE2AE + Leaf = &HE8BE + LeaveChat = &HE89B + LeaveChatLegacy = &HE11F + LeaveChatMirrored = &HEA54 + LEDLight = &HE781 + LeftArrowKeyTime0 = &HEC52 + LeftDoubleQuote = &HE9B2 + LeftQuote = &HE848 + LengthLegacy = &HE2AD + Library = &HE8F1 + LibraryLegacy = &HE1D3 + Light = &HE793 + Lightbulb = &HEA80 + LightningBolt = &HE945 + LikeDislike = &HE8DF + LikeDislikeLegacy = &HE19D + LikeInlineLegacy = &HE209 + LikeLegacy = &HE19F + Link = &HE71B + LinkLegacy = &HE167 + List = &HEA37 + ListLegacy = &HE14C + ListLegacyMirrored = &HE175 + ListMirrored = &HEA55 + Location = &HE81D + LocationLegacy = &HE1D2 + Lock = &HE72E + LockLegacy = &HE1F6 + LockscreenDesktop = &HEE3F + LockScreenGlance = &HEE65 + LowerBrightness = &HEC8A + MagStripeReader = &HEC5C + Mail = &HE715 + MailBadge12 = &HEDB3 + MailFill = &HE8A8 + MailFillLegacy = &HE135 + MailForward = &HE89C + MailForwardLegacy = &HE120 + MailForwardLegacyMirrored = &HE1A8 + MailForwardMirrored = &HEA56 + MailLegacy = &HE119 + MailMessageLegacy = &HE20B + MailReply = &HE8CA + MailReplyAll = &HE8C2 + MailReplyAllLegacy = &HE165 + MailReplyAllLegacyMirrored = &HE1F2 + MailReplyAllMirrored = &HEA58 + MailReplyLegacy = &HE172 + MailReplyLegacyMirrored = &HE1AF + MailReplyMirrored = &HEA57 + Manage = &HE912 + ManageLegacy = &HE178 + MapCompassBottom = &HE813 + MapCompassTop = &HE812 + MapDirections = &HE816 + MapDrive = &HE8CE + MapDriveLegacy = &HE17B + MapLayers = &HE81E + MapLegacy = &HE1C4 + MapPin = &HE707 + MapPin2 = &HE7B7 + MapPinLegacy = &HE139 + Marker = &HED64 + Marquee = &HEF20 + Media = &HEA69 + MediaStorageTower = &HE965 + Megaphone = &HE789 + Memo = &HE77C + MemoLegacy = &HE1D5 + Message = &HE8BD + MessageLegacy = &HE15F + MicClipping = &HEC72 + MicError = &HEC56 + MicOff = &HEC54 + MicOn = &HEC71 + Microphone = &HE720 + MicrophoneLegacy = &HE1D6 + MicSleep = &HEC55 + MiracastLogoLarge = &HEC16 + MiracastLogoSmall = &HEC15 + MobActionCenter = &HEC42 + MobAirplane = &HEC40 + MobBattery0 = &HEBA0 + MobBattery1 = &HEBA1 + MobBattery10 = &HEBAA + MobBattery2 = &HEBA2 + MobBattery3 = &HEBA3 + MobBattery4 = &HEBA4 + MobBattery5 = &HEBA5 + MobBattery6 = &HEBA6 + MobBattery7 = &HEBA7 + MobBattery8 = &HEBA8 + MobBattery9 = &HEBA9 + MobBatteryCharging0 = &HEBAB + MobBatteryCharging1 = &HEBAC + MobBatteryCharging10 = &HEBB5 + MobBatteryCharging2 = &HEBAD + MobBatteryCharging3 = &HEBAE + MobBatteryCharging4 = &HEBAF + MobBatteryCharging5 = &HEBB0 + MobBatteryCharging6 = &HEBB1 + MobBatteryCharging7 = &HEBB2 + MobBatteryCharging8 = &HEBB3 + MobBatteryCharging9 = &HEBB4 + MobBatterySaver0 = &HEBB6 + MobBatterySaver1 = &HEBB7 + MobBatterySaver10 = &HEBC0 + MobBatterySaver2 = &HEBB8 + MobBatterySaver3 = &HEBB9 + MobBatterySaver4 = &HEBBA + MobBatterySaver5 = &HEBBB + MobBatterySaver6 = &HEBBC + MobBatterySaver7 = &HEBBD + MobBatterySaver8 = &HEBBE + MobBatterySaver9 = &HEBBF + MobBatteryUnknown = &HEC02 + MobBluetooth = &HEC41 + MobCallForwarding = &HEC7E + MobCallForwardingMirrored = &HEC7F + MobDrivingMode = &HEC47 + MobileContactLegacy = &HE25A + MobileLocked = &HEC20 + MobileSelected = &HEC75 + MobileTablet = &HE8CC + MobLocation = &HEC43 + MobQuietHours = &HEC46 + MobSignal1 = &HEC37 + MobSignal2 = &HEC38 + MobSignal3 = &HEC39 + MobSignal4 = &HEC3A + MobSignal5 = &HEC3B + MobWifi1 = &HEC3C + MobWifi2 = &HEC3D + MobWifi3 = &HEC3E + MobWifi4 = &HEC3F + MobWifiHotspot = &HEC44 + More = &HE712 + MoreLegacy = &HE10C + Mouse = &HE962 + MoveToFolder = &HE8DE + MoveToFolderLegacy = &HE19C + Movies = &HE8B2 + MultimediaDMP = &HED47 + MultimediaDMS = &HE953 + MultimediaDVR = &HE954 + MultimediaPMP = &HE955 + MultiSelect = &HE762 + MultiSelectLegacy = &HE133 + MultiSelectLegacyMirrored = &HE1EF + MultiSelectMirrored = &HEA98 + Multitask = &HE7C4 + Multitask16 = &HEE40 + MultitaskExpanded = &HEB91 + MusicAlbum = &HE93C + MusicInfo = &HE90B + MusicInfoLegacy = &HE142 + MusicNote = &HEC4F + Mute = &HE74F + MuteLegacy = &HE198 + MyNetwork = &HEC27 + Narrator = &HED4D + NarratorForward = &HEDA9 + NarratorForwardMirrored = &HEDAA + Network = &HE968 + NetworkAdapter = &HEDA3 + NetworkPrinter = &HEDA5 + NetworkTower = &HEC05 + NewFolder = &HE8F4 + NewFolderLegacy = &HE1DA + NewWindow = &HE78B + NewWindowLegacy = &HE17C + NextLegacy = &HE101 + NUIFace = &HEB68 + NUIFPContinueSlideAction = &HEB85 + NUIFPContinueSlideHand = &HEB84 + NUIFPPressAction = &HEB8B + NUIFPPressHand = &HEB8A + NUIFPPressRepeatAction = &HEB8D + NUIFPPressRepeatHand = &HEB8C + NUIFPRollLeftAction = &HEB89 + NUIFPRollLeftHand = &HEB88 + NUIFPRollRightHand = &HEB86 + NUIFPRollRightHandAction = &HEB87 + NUIFPStartSlideAction = &HEB83 + NUIFPStartSlideHand = &HEB82 + NUIIris = &HEB67 + OEM = &HE74C + OneBar = &HE905 + OneBarLegacy = &HE1E6 + OpenFile = &HE8E5 + OpenFileLegacy = &HE1A5 + OpenInNewWindow = &HE8A7 + OpenInNewWindowLegacy = &HE2B4 + OpenLocal = &HE8DA + OpenLocalLegacy = &HE197 + OpenPane = &HE8A0 + OpenPaneLegacy = &HE127 + OpenPaneLegacyMirrored = &HE1C0 + OpenPaneMirrored = &HEA5B + OpenWith = &HE7AC + OpenWithLegacy = &HE17D + OpenWithLegacyMirrored = &HE1ED + OpenWithMirrored = &HEA5C + Orientation = &HE8B4 + OrientationLegacy = &HE14F + OtherUser = &HE7EE + OtherUserLegacy = &HE1A6 + OutlineStarLegacy = &HE1CE + Package = &HE7B8 + Page = &HE7C3 + PageFillLegacy = &HE132 + PageLeft = &HE760 + PageLegacy = &HE160 + PageRight = &HE761 + PageSolid = &HE729 + PanMode = &HECE9 + ParkingLocation = &HE811 + ParkingLocationMirrored = &HEA5E + ParkingLocationSolid = &HEA8B + PartyLeader = &HECA7 + PasswordKeyHide = &HE9A9 + PasswordKeyShow = &HE9A8 + Paste = &HE77F + PasteLegacy = &HE16D + Pause = &HE769 + PauseBadge12 = &HEDB4 + PauseLegacy = &HE103 + PC1 = &HE977 + PC1Legacy = &HE211 + Pencil = &HED63 + PenPalette = &HEE56 + PenPaletteMirrored = &HEF16 + PenWorkspace = &HEDC6 + PenWorkspaceMirrored = &HEF15 + People = &HE716 + PeopleLegacy = &HE125 + PeriodKey = &HE843 + Permissions = &HE8D7 + PermissionsLegacy = &HE192 + PersonalFolder = &HEC25 + Personalize = &HE771 + Phone = &HE717 + PhoneBook = &HE780 + PhoneBookLegacy = &HE1D4 + PhoneLegacy = &HE13A + Photo = &HE91B + Photo2 = &HEB9F + Picture = &HE8B9 + PictureLegacy = &HE158 + PieSingle = &HEB05 + Pin = &HE718 + PinFill = &HE841 + PinLegacy = &HE141 + Pinned = &HE840 + PinnedFill = &HE842 + PlaceFolderLegacy = &HE18A + PLAP = &HEC19 + Play = &HE768 + Play36 = &HEE4A + PlaybackRate1x = &HEC57 + PlaybackRateOther = &HEC58 + PlayBadge12 = &HEDB5 + PlayLegacy = &HE102 + PlayOnLegacy = &HE29B + PointErase = &HED61 + PointEraseMirrored = &HEF18 + PoliceCar = &HEC81 + PostUpdate = &HE8F3 + PostUpdateLegacy = &HE1D7 + PowerButton = &HE7E8 + PresenceChicklet = &HE978 + PresenceChickletLegacy = &HE25E + PresenceChickletVideo = &HE979 + PresenceChickletVideoLegacy = &HE25D + Preview = &HE8FF + PreviewLegacy = &HE295 + PreviewLink = &HE8A1 + PreviewLinkLegacy = &HE12A + Previous = &HE892 + PreviousLegacy = &HE100 + Print = &HE749 + Printer3D = &HE914 + Printer3DLegacy = &HE2F7 + PrintfaxPrinterFile = &HE956 + PrintLegacy = &HE2F6 + Priority = &HE8D0 + PriorityLegacy = &HE182 + Process = &HE9F3 + Project = &HEBC6 + Projector = &HE95D + ProtectedDocument = &HE8A6 + ProtectedDocumentLegacy = &HE131 + ProvisioningPackage = &HE835 + PuncKey = &HE844 + PuncKey0 = &HE84C + PuncKey1 = &HE9B4 + PuncKey2 = &HE9B5 + PuncKey3 = &HE9B6 + PuncKey4 = &HE9B7 + PuncKey5 = &HE9B8 + PuncKey6 = &HE9B9 + PuncKey7 = &HE9BB + PuncKey8 = &HE9BC + PuncKey9 = &HE9BA + PuncKeyLeftBottom = &HE84D + PuncKeyRightBottom = &HE9B3 + Puzzle = &HEA86 + QuickNote = &HE70B + QuietHours = &HE708 + QWERTYOff = &HE983 + QWERTYOn = &HE982 + RadioBtnOff = &HECCA + RadioBtnOn = &HECCB + RadioBullet = &HE915 + RadioBullet2 = &HECCC + RatingStarFillLegacy = &HEB4 + RatingStarFillReducedPaddingHTMLLegacy = &HE82 + RatingStarFillSmallLegacy = &HEB5 + RatingStarFillZeroWidthLegacy = &HEA + RatingStarLegacy = &HE224 + Read = &HE8C3 + ReadingList = &HE7BC + ReadLegacy = &HE166 + ReceiptPrinter = &HEC5B + Recent = &HE823 + Record = &HE7C8 + RecordLegacy = &HE1F5 + Redo = &HE7A6 + RedoLegacy = &HE10D + ReduceTileLegacy = &HE140 + ReduceTileLegacyMirrored = &HE177 + Refresh = &HE72C + RefreshLegacy = &HE149 + RememberedDevice = &HE70C + Reminder = &HEB50 + ReminderFill = &HEB4F + Remote = &HE8AF + RemoteLegacy = &HE148 + Remove = &HE738 + RemoveFrom = &HECC9 + RemoveLegacy = &HE108 + Rename = &HE8AC + RenameLegacy = &HE13E + Repair = &HE90F + RepairLegacy = &HE15E + RepeatAll = &HE8EE + RepeatAllLegacy = &HE1CD + RepeatOne = &HE8ED + RepeatOneLegacy = &HE1CC + Reply = &HE97A + ReplyLegacy = &HE248 + ReplyMirrored = &HEE35 + ReportHacked = &HE730 + ReportHackedLegacy = &HE1DE + ResetDevice = &HED10 + ResetDrive = &HEBC4 + Reshare = &HE8EB + ReshareLegacy = &HE1CA + ResizeMouseLarge = &HE747 + ResizeMouseMedium = &HE744 + ResizeMouseMediumMirrored = &HEA5F + ResizeMouseSmall = &HE743 + ResizeMouseSmallMirrored = &HEA60 + ResizeMouseTall = &HE746 + ResizeMouseTallMirrored = &HEA61 + ResizeMouseWide = &HE745 + ResizeTouchLarger = &HE741 + ResizeTouchNarrower = &HE7EA + ResizeTouchNarrowerMirrored = &HEA62 + ResizeTouchShorter = &HE7EB + ResizeTouchSmaller = &HE742 + ResolutionLegacy = &HE2AC + ReturnKey = &HE751 + ReturnKeyLg = &HEB97 + ReturnKeySm = &HE966 + ReturnToWindow = &HE944 + ReturnToWindowLegacy = &HE2B3 + RevealPasswordLegacy = &HE52 + RevToggleKey = &HE845 + Rewind = &HEB9E + RightArrowKeyTime0 = &HEBE7 + RightArrowKeyTime1 = &HE846 + RightArrowKeyTime2 = &HE847 + RightArrowKeyTime3 = &HE84E + RightArrowKeyTime4 = &HE84F + RightDoubleQuote = &HE9B1 + RightQuote = &HE849 + Ringer = &HEA8F + RingerBadge12 = &HEDAC + RingerSilent = &HE7ED + RoamingDomestic = &HE879 + RoamingInternational = &HE878 + Robot = &HE99A + Rotate = &HE7AD + RotateCamera = &HE89E + RotateCameraLegacy = &HE124 + RotateLegacy = &HE14A + RotateMapLeft = &HE80D + RotateMapRight = &HE80C + RotationLock = &HE755 + Ruler = &HED5E + Save = &HE74E + SaveAs = &HE792 + SaveAsLegacy = &HE28F + SaveCopy = &HEA35 + SaveLegacy = &HE105 + SaveLocal = &HE78C + SaveLocalLegacy = &HE159 + Scan = &HE8FE + ScanLegacy = &HE294 + ScrollChevronDownBoldLegacy = &HE19 + ScrollChevronDownLegacy = &HE11 + ScrollChevronLeftBoldLegacy = &HE16 + ScrollChevronLeftLegacy = &HEE + ScrollChevronRightBoldLegacy = &HE17 + ScrollChevronRightLegacy = &HEF + ScrollChevronUpBoldLegacy = &HE18 + ScrollChevronUpLegacy = &HE10 + ScrollMode = &HECE7 + ScrollUpDown = &HEC8F + SDCard = &HE7F1 + Search = &HE721 + SearchAndApps = &HE773 + SearchboxLegacy = &HE94 + SelectAll = &HE8B3 + SelectAllLegacy = &HE14E + SemanticZoomLegacy = &HEB8 + Send = &HE724 + SendFill = &HE725 + SendFillMirrored = &HEA64 + SendLegacy = &HE122 + SendMirrored = &HEA63 + Sensor = &HE957 + SetlockScreen = &HE7B5 + SetlockScreenLegacy = &HE18C + SetTile = &HE97B + SetTileLegacy = &HE18D + Settings = &HE713 + SettingsBattery = &HEE63 + SettingsDisplaySound = &HE7F3 + SettingsLegacy = &HE115 + Share = &HE72D + ShareBroadband = &HE83A + Shop = &HE719 + ShopLegacy = &HE14D + ShoppingCart = &HE7BF + ShowAllFiles1Legacy = &HE153 + ShowAllFiles3Legacy = &HE152 + ShowAllFilesLegacy = &HE154 + ShowBcc = &HE8C4 + ShowBccLegacy = &HE169 + ShowResults = &HE8BC + ShowResultsLegacy = &HE15C + ShowResultsLegacyMirrored = &HE1F1 + ShowResultsMirrored = &HEA65 + Shuffle = &HE8B1 + ShuffleLegacy = &HE14B + SignalBars1 = &HE86C + SignalBars2 = &HE86D + SignalBars3 = &HE86E + SignalBars4 = &HE86F + SignalBars5 = &HE870 + SignalError = &HED2E + SignalNotConnected = &HE871 + SignalRoaming = &HEC1E + SIMLock = &HE875 + SIMMissing = &HE876 + SIPMove = &HE759 + SIPRedock = &HE75B + SIPUndock = &HE75A + SizeLegacy = &HE2B2 + SkipBack10 = &HED3C + SkipForward30 = &HED3D + SliderThumb = &HEC13 + Slideshow = &HE786 + SlideshowLegacy = &HE173 + Smartcard = &HE963 + SmartcardVirtual = &HE964 + SolidStarLegacy = &HE1CF + Sort = &HE8CB + SortLegacy = &HE174 + Speakers = &HE7F5 + SpeedHigh = &HEC4A + SpeedMedium = &HEC49 + SpeedOff = &HEC48 + StartPoint = &HE819 + StartPointSolid = &HEB49 + StatusCircle = &HEA81 + StatusCircleLeft = &HEBFD + StatusConnecting1 = &HEB57 + StatusConnecting2 = &HEB58 + StatusDataTransfer = &HE880 + StatusDataTransferVPN = &HE881 + StatusDualSIM1 = &HE884 + StatusDualSIM1VPN = &HE885 + StatusDualSIM2 = &HE882 + StatusDualSIM2VPN = &HE883 + StatusError = &HEA83 + StatusErrorFull = &HEB90 + StatusErrorLeft = &HEBFF + StatusSGLTE = &HE886 + StatusSGLTECell = &HE887 + StatusSGLTEDataVPN = &HE888 + StatusTriangle = &HEA82 + StatusTriangleLeft = &HEBFE + StatusUnsecure = &HEB59 + StatusVPN = &HE889 + StatusWarning = &HEA84 + StatusWarningLeft = &HEC00 + StockDown = &HEB0F + StockUp = &HEB11 + StopLegacy = &HE15B + StopPoint = &HE81A + StopPointSolid = &HEB4A + StopSlideshowLegacy = &HE191 + Stopwatch = &HE916 + StorageNetworkWireless = &HE969 + StorageOptical = &HE958 + StorageTape = &HE96A + Streaming = &HE93E + StreamingEnterprise = &HED2F + Street = &HE913 + StreetLegacy = &HE1C3 + StreetsideSplitExpand = &HE803 + StreetsideSplitMinimize = &HE802 + StrokeErase = &HED60 + StrokeEraseMirrored = &HEF17 + Subtitles = &HED1E + SubtitlesAudio = &HED1F + SurfaceHub = &HE8AE + Sustainable = &HEC0A + Swipe = &HE927 + SwipeRevealArt = &HEC6D + Switch = &HE8AB + SwitchApps = &HE8F9 + SwitchAppsLegacy = &HE1E1 + SwitchLegacy = &HE13C + SwitchUser = &HE748 + Sync = &HE895 + SyncBadge12 = &HEDAB + SyncError = &HEA6A + SyncFolder = &HE8F7 + SyncFolderLegacy = &HE1DF + SyncLegacy = &HE117 + System = &HE770 + Tablet = &HE70A + TabletMode = &HEBFC + TabletSelected = &HEC74 + Tag = &HE8EC + TagLegacy = &HE1CB + TapAndSend = &HE9A1 + TaskbarPhone = &HEE64 + ThisPC = &HEC4E + ThoughtBubble = &HEA91 + ThreeBars = &HE907 + ThreeBarsLegacy = &HE1E8 + Tiles = &HECA5 + TiltDown = &HE80A + TiltUp = &HE809 + TimeLanguage = &HE775 + ToggleBorder = &HEC12 + ToggleFilled = &HEC11 + ToggleThumb = &HEC14 + ToolTip = &HE82F + Touch = &HE815 + TouchPointer = &HE7C9 + TouchPointerLegacy = &HE1E3 + Touchscreen = &HEDA4 + Trackers = &HEADF + TrackersMirrored = &HEE92 + Train = &HE7C0 + TrainSolid = &HEB4D + TreeFolderFolder = &HED41 + TreeFolderFolderFill = &HED42 + TreeFolderFolderOpen = &HED43 + TreeFolderFolderOpenFill = &HED44 + Trim = &HE78A + TrimLegacy = &HE12C + TVMonitor = &HE7F4 + TVMonitorSelected = &HEC77 + TwoBars = &HE906 + TwoBarsLegacy = &HE1E7 + TwoPage = &HE89A + TwoPageLegacy = &HE11E + Type = &HE97C + TypeLegacy = &HE2B0 + TypingIndicatorLegacy = &HE25C + Underline = &HE8DC + UnderlineLegacy = &HE19A + UnderlineLKoreanLegacy = &HE1BB + UnderlineRussianLegacy = &HE1B8 + UnderlineSLegacy = &HE1B2 + UnderlineULegacy = &HE1B5 + UnderscoreSpace = &HE75D + Undo = &HE7A7 + UndoLegacy = &HE10E + Unfavorite = &HE8D9 + Unfavorite2Legacy = &HE24A + UnfavoriteLegacy = &HE195 + Unit = &HECC6 + Unlock = &HE785 + UnlockLegacy = &HE1F7 + Unpin = &HE77A + UnpinLegacy = &HE196 + UnsyncFolder = &HE8F6 + UnsyncFolderLegacy = &HE1DD + Up = &HE74A + UpArrowShiftKey = &HE752 + UpdateRestore = &HE777 + UpLegacy = &HE110 + Upload = &HE898 + UploadLegacy = &HE11C + UploadSkyDriveLegacy = &HE183 + UpShiftKey = &HE84B + USB = &HE88E + USBSafeConnect = &HECF3 + Vibrate = &HE877 + Video = &HE714 + VideoChat = &HE8AA + VideoChatLegacy = &HE13B + VideoInlineLegacy = &HE20A + VideoLegacy = &HE116 + View = &HE890 + ViewAll = &HE8A9 + ViewAllLegacy = &HE138 + ViewLegacy = &HE18B + Volume = &HE767 + Volume0 = &HE992 + Volume1 = &HE993 + Volume2 = &HE994 + Volume3 = &HE995 + VolumeBars = &HEBC5 + VolumeLegacy = &HE15D + VPN = &HE705 + Walk = &HE805 + WalkSolid = &HE726 + Warning = &HE7BA + Webcam = &HE8B8 + Webcam2 = &HE960 + WebcamLegacy = &HE156 + Wheel = &HEE94 + Wifi = &HE701 + Wifi1 = &HE872 + Wifi2 = &HE873 + Wifi3 = &HE874 + WifiAttentionOverlay = &HE998 + WifiCall0 = &HEBD5 + WifiCall1 = &HEBD6 + WifiCall2 = &HEBD7 + WifiCall3 = &HEBD8 + WifiCall4 = &HEBD9 + WifiCallBars = &HEBD4 + WifiError0 = &HEB5A + WifiError1 = &HEB5B + WifiError2 = &HEB5C + WifiError3 = &HEB5D + WifiError4 = &HEB5E + WifiEthernet = &HEE77 + WifiHotspot = &HE88A + WifiWarning0 = &HEB5F + WifiWarning1 = &HEB60 + WifiWarning2 = &HEB61 + WifiWarning3 = &HEB62 + WifiWarning4 = &HEB63 + WindDirection = &HEBE6 + WiredUSB = &HECF0 + WirelessUSB = &HECF1 + Work = &HE821 + WorkSolid = &HEB4E + World = &HE909 + WorldLegacy = &HE128 + XboxOneConsole = &HE990 + ZeroBars = &HE904 + ZeroBarsLegacy = &HE1E5 + Zoom = &HE71E + ZoomIn = &HE8A3 + ZoomInLegacy = &HE12E + ZoomLegacy = &HE1A3 + ZoomMode = &HECE8 + ZoomOut = &HE71F + ZoomOutLegacy = &HE1A4 + fa_500px = &HF26E + fa_address_book = &HF2B9 + fa_address_book_o = &HF2BA + fa_address_card = &HF2BB + fa_address_card_o = &HF2BC + fa_adjust = &HF042 + fa_adn = &HF170 + fa_align_center = &HF037 + fa_align_justify = &HF039 + fa_align_left = &HF036 + fa_align_right = &HF038 + fa_amazon = &HF270 + fa_ambulance = &HF0F9 + fa_american_sign_language_interpreting = &HF2A3 + fa_anchor = &HF13D + fa_android = &HF17B + fa_angellist = &HF209 + fa_angle_double_down = &HF103 + fa_angle_double_left = &HF100 + fa_angle_double_right = &HF101 + fa_angle_double_up = &HF102 + fa_angle_down = &HF107 + fa_angle_left = &HF104 + fa_angle_right = &HF105 + fa_angle_up = &HF106 + fa_apple = &HF179 + fa_archive = &HF187 + fa_area_chart = &HF1FE + fa_arrow_circle_down = &HF0AB + fa_arrow_circle_left = &HF0A8 + fa_arrow_circle_o_down = &HF01A + fa_arrow_circle_o_left = &HF190 + fa_arrow_circle_o_right = &HF18E + fa_arrow_circle_o_up = &HF01B + fa_arrow_circle_right = &HF0A9 + fa_arrow_circle_up = &HF0AA + fa_arrow_down = &HF063 + fa_arrow_left = &HF060 + fa_arrow_right = &HF061 + fa_arrow_up = &HF062 + fa_arrows = &HF047 + fa_arrows_alt = &HF0B2 + fa_arrows_h = &HF07E + fa_arrows_v = &HF07D + fa_asl_interpreting = &HF2A3 + fa_assistive_listening_systems = &HF2A2 + fa_asterisk = &HF069 + fa_at = &HF1FA + fa_audio_description = &HF29E + fa_automobile = &HF1B9 + fa_backward = &HF04A + fa_balance_scale = &HF24E + fa_ban = &HF05E + fa_bandcamp = &HF2D5 + fa_bank = &HF19C + fa_bar_chart = &HF080 + fa_bar_chart_o = &HF080 + fa_barcode = &HF02A + fa_bars = &HF0C9 + fa_bath = &HF2CD + fa_bathtub = &HF2CD + fa_battery = &HF240 + fa_battery_0 = &HF244 + fa_battery_1 = &HF243 + fa_battery_2 = &HF242 + fa_battery_3 = &HF241 + fa_battery_4 = &HF240 + fa_battery_empty = &HF244 + fa_battery_full = &HF240 + fa_battery_half = &HF242 + fa_battery_quarter = &HF243 + fa_battery_three_quarters = &HF241 + fa_bed = &HF236 + fa_beer = &HF0FC + fa_behance = &HF1B4 + fa_behance_square = &HF1B5 + fa_bell = &HF0F3 + fa_bell_o = &HF0A2 + fa_bell_slash = &HF1F6 + fa_bell_slash_o = &HF1F7 + fa_bicycle = &HF206 + fa_binoculars = &HF1E5 + fa_birthday_cake = &HF1FD + fa_bitbucket = &HF171 + fa_bitbucket_square = &HF172 + fa_bitcoin = &HF15A + fa_black_tie = &HF27E + fa_blind = &HF29D + fa_bluetooth = &HF293 + fa_bluetooth_b = &HF294 + fa_bold = &HF032 + fa_bolt = &HF0E7 + fa_bomb = &HF1E2 + fa_book = &HF02D + fa_bookmark = &HF02E + fa_bookmark_o = &HF097 + fa_braille = &HF2A1 + fa_briefcase = &HF0B1 + fa_btc = &HF15A + fa_bug = &HF188 + fa_building = &HF1AD + fa_building_o = &HF0F7 + fa_bullhorn = &HF0A1 + fa_bullseye = &HF140 + fa_bus = &HF207 + fa_buysellads = &HF20D + fa_cab = &HF1BA + fa_calculator = &HF1EC + fa_calendar = &HF073 + fa_calendar_check_o = &HF274 + fa_calendar_minus_o = &HF272 + fa_calendar_o = &HF133 + fa_calendar_plus_o = &HF271 + fa_calendar_times_o = &HF273 + fa_camera = &HF030 + fa_camera_retro = &HF083 + fa_car = &HF1B9 + fa_caret_down = &HF0D7 + fa_caret_left = &HF0D9 + fa_caret_right = &HF0DA + fa_caret_square_o_down = &HF150 + fa_caret_square_o_left = &HF191 + fa_caret_square_o_right = &HF152 + fa_caret_square_o_up = &HF151 + fa_caret_up = &HF0D8 + fa_cart_arrow_down = &HF218 + fa_cart_plus = &HF217 + fa_cc = &HF20A + fa_cc_amex = &HF1F3 + fa_cc_diners_club = &HF24C + fa_cc_discover = &HF1F2 + fa_cc_jcb = &HF24B + fa_cc_mastercard = &HF1F1 + fa_cc_paypal = &HF1F4 + fa_cc_stripe = &HF1F5 + fa_cc_visa = &HF1F0 + fa_certificate = &HF0A3 + fa_chain = &HF0C1 + fa_chain_broken = &HF127 + fa_check = &HF00C + fa_check_circle = &HF058 + fa_check_circle_o = &HF05D + fa_check_square = &HF14A + fa_check_square_o = &HF046 + fa_chevron_circle_down = &HF13A + fa_chevron_circle_left = &HF137 + fa_chevron_circle_right = &HF138 + fa_chevron_circle_up = &HF139 + fa_chevron_down = &HF078 + fa_chevron_left = &HF053 + fa_chevron_right = &HF054 + fa_chevron_up = &HF077 + fa_child = &HF1AE + fa_chrome = &HF268 + fa_circle = &HF111 + fa_circle_o = &HF10C + fa_circle_o_notch = &HF1CE + fa_circle_thin = &HF1DB + fa_clipboard = &HF0EA + fa_clock_o = &HF017 + fa_clone = &HF24D + fa_close = &HF00D + fa_cloud = &HF0C2 + fa_cloud_download = &HF0ED + fa_cloud_upload = &HF0EE + fa_cny = &HF157 + fa_code = &HF121 + fa_code_fork = &HF126 + fa_codepen = &HF1CB + fa_codiepie = &HF284 + fa_coffee = &HF0F4 + fa_cog = &HF013 + fa_cogs = &HF085 + fa_columns = &HF0DB + fa_comment = &HF075 + fa_comment_o = &HF0E5 + fa_commenting = &HF27A + fa_commenting_o = &HF27B + fa_comments = &HF086 + fa_comments_o = &HF0E6 + fa_compass = &HF14E + fa_compress = &HF066 + fa_connectdevelop = &HF20E + fa_contao = &HF26D + fa_copy = &HF0C5 + fa_copyright = &HF1F9 + fa_creative_commons = &HF25E + fa_credit_card = &HF09D + fa_credit_card_alt = &HF283 + fa_crop = &HF125 + fa_crosshairs = &HF05B + fa_css3 = &HF13C + fa_cube = &HF1B2 + fa_cubes = &HF1B3 + fa_cut = &HF0C4 + fa_cutlery = &HF0F5 + fa_dashboard = &HF0E4 + fa_dashcube = &HF210 + fa_database = &HF1C0 + fa_deaf = &HF2A4 + fa_deafness = &HF2A4 + fa_dedent = &HF03B + fa_delicious = &HF1A5 + fa_desktop = &HF108 + fa_deviantart = &HF1BD + fa_diamond = &HF219 + fa_digg = &HF1A6 + fa_dollar = &HF155 + fa_dot_circle_o = &HF192 + fa_download = &HF019 + fa_dribbble = &HF17D + fa_drivers_license = &HF2C2 + fa_drivers_license_o = &HF2C3 + fa_dropbox = &HF16B + fa_drupal = &HF1A9 + fa_edge = &HF282 + fa_edit = &HF044 + fa_eercast = &HF2DA + fa_eject = &HF052 + fa_ellipsis_h = &HF141 + fa_ellipsis_v = &HF142 + fa_empire = &HF1D1 + fa_envelope = &HF0E0 + fa_envelope_o = &HF003 + fa_envelope_open = &HF2B6 + fa_envelope_open_o = &HF2B7 + fa_envelope_square = &HF199 + fa_envira = &HF299 + fa_eraser = &HF12D + fa_etsy = &HF2D7 + fa_eur = &HF153 + fa_euro = &HF153 + fa_exchange = &HF0EC + fa_exclamation = &HF12A + fa_exclamation_circle = &HF06A + fa_exclamation_triangle = &HF071 + fa_expand = &HF065 + fa_expeditedssl = &HF23E + fa_external_link = &HF08E + fa_external_link_square = &HF14C + fa_eye = &HF06E + fa_eye_slash = &HF070 + fa_eyedropper = &HF1FB + fa_fa = &HF2B4 + fa_facebook = &HF09A + fa_facebook_f = &HF09A + fa_facebook_official = &HF230 + fa_facebook_square = &HF082 + fa_fast_backward = &HF049 + fa_fast_forward = &HF050 + fa_fax = &HF1AC + fa_feed = &HF09E + fa_female = &HF182 + fa_fighter_jet = &HF0FB + fa_file = &HF15B + fa_file_archive_o = &HF1C6 + fa_file_audio_o = &HF1C7 + fa_file_code_o = &HF1C9 + fa_file_excel_o = &HF1C3 + fa_file_image_o = &HF1C5 + fa_file_movie_o = &HF1C8 + fa_file_o = &HF016 + fa_file_pdf_o = &HF1C1 + fa_file_photo_o = &HF1C5 + fa_file_picture_o = &HF1C5 + fa_file_powerpoint_o = &HF1C4 + fa_file_sound_o = &HF1C7 + fa_file_text = &HF15C + fa_file_text_o = &HF0F6 + fa_file_video_o = &HF1C8 + fa_file_word_o = &HF1C2 + fa_file_zip_o = &HF1C6 + fa_files_o = &HF0C5 + fa_film = &HF008 + fa_filter = &HF0B0 + fa_fire = &HF06D + fa_fire_extinguisher = &HF134 + fa_firefox = &HF269 + fa_first_order = &HF2B0 + fa_flag = &HF024 + fa_flag_checkered = &HF11E + fa_flag_o = &HF11D + fa_flash = &HF0E7 + fa_flask = &HF0C3 + fa_flickr = &HF16E + fa_floppy_o = &HF0C7 + fa_folder = &HF07B + fa_folder_o = &HF114 + fa_folder_open = &HF07C + fa_folder_open_o = &HF115 + fa_font = &HF031 + fa_font_awesome = &HF2B4 + fa_fonticons = &HF280 + fa_fort_awesome = &HF286 + fa_forumbee = &HF211 + fa_forward = &HF04E + fa_foursquare = &HF180 + fa_free_code_camp = &HF2C5 + fa_frown_o = &HF119 + fa_futbol_o = &HF1E3 + fa_gamepad = &HF11B + fa_gavel = &HF0E3 + fa_gbp = &HF154 + fa_ge = &HF1D1 + fa_gear = &HF013 + fa_gears = &HF085 + fa_genderless = &HF22D + fa_get_pocket = &HF265 + fa_gg = &HF260 + fa_gg_circle = &HF261 + fa_gift = &HF06B + fa_git = &HF1D3 + fa_git_square = &HF1D2 + fa_github = &HF09B + fa_github_alt = &HF113 + fa_github_square = &HF092 + fa_gitlab = &HF296 + fa_gittip = &HF184 + fa_glass = &HF000 + fa_glide = &HF2A5 + fa_glide_g = &HF2A6 + fa_globe = &HF0AC + fa_google = &HF1A0 + fa_google_plus = &HF0D5 + fa_google_plus_circle = &HF2B3 + fa_google_plus_official = &HF2B3 + fa_google_plus_square = &HF0D4 + fa_google_wallet = &HF1EE + fa_graduation_cap = &HF19D + fa_gratipay = &HF184 + fa_grav = &HF2D6 + fa_group = &HF0C0 + fa_h_square = &HF0FD + fa_hacker_news = &HF1D4 + fa_hand_grab_o = &HF255 + fa_hand_lizard_o = &HF258 + fa_hand_o_down = &HF0A7 + fa_hand_o_left = &HF0A5 + fa_hand_o_right = &HF0A4 + fa_hand_o_up = &HF0A6 + fa_hand_paper_o = &HF256 + fa_hand_peace_o = &HF25B + fa_hand_pointer_o = &HF25A + fa_hand_rock_o = &HF255 + fa_hand_scissors_o = &HF257 + fa_hand_spock_o = &HF259 + fa_hand_stop_o = &HF256 + fa_handshake_o = &HF2B5 + fa_hard_of_hearing = &HF2A4 + fa_hashtag = &HF292 + fa_hdd_o = &HF0A0 + fa_header = &HF1DC + fa_headphones = &HF025 + fa_heart = &HF004 + fa_heart_o = &HF08A + fa_heartbeat = &HF21E + fa_history = &HF1DA + fa_home = &HF015 + fa_hospital_o = &HF0F8 + fa_hotel = &HF236 + fa_hourglass = &HF254 + fa_hourglass_1 = &HF251 + fa_hourglass_2 = &HF252 + fa_hourglass_3 = &HF253 + fa_hourglass_end = &HF253 + fa_hourglass_half = &HF252 + fa_hourglass_o = &HF250 + fa_hourglass_start = &HF251 + fa_houzz = &HF27C + fa_html5 = &HF13B + fa_i_cursor = &HF246 + fa_id_badge = &HF2C1 + fa_id_card = &HF2C2 + fa_id_card_o = &HF2C3 + fa_ils = &HF20B + fa_image = &HF03E + fa_imdb = &HF2D8 + fa_inbox = &HF01C + fa_indent = &HF03C + fa_industry = &HF275 + fa_info = &HF129 + fa_info_circle = &HF05A + fa_inr = &HF156 + fa_instagram = &HF16D + fa_institution = &HF19C + fa_internet_explorer = &HF26B + fa_intersex = &HF224 + fa_ioxhost = &HF208 + fa_italic = &HF033 + fa_joomla = &HF1AA + fa_jpy = &HF157 + fa_jsfiddle = &HF1CC + fa_key = &HF084 + fa_keyboard_o = &HF11C + fa_krw = &HF159 + fa_language = &HF1AB + fa_laptop = &HF109 + fa_lastfm = &HF202 + fa_lastfm_square = &HF203 + fa_leaf = &HF06C + fa_leanpub = &HF212 + fa_legal = &HF0E3 + fa_lemon_o = &HF094 + fa_level_down = &HF149 + fa_level_up = &HF148 + fa_life_bouy = &HF1CD + fa_life_buoy = &HF1CD + fa_life_ring = &HF1CD + fa_life_saver = &HF1CD + fa_lightbulb_o = &HF0EB + fa_line_chart = &HF201 + fa_link = &HF0C1 + fa_linkedin = &HF0E1 + fa_linkedin_square = &HF08C + fa_linode = &HF2B8 + fa_linux = &HF17C + fa_list = &HF03A + fa_list_alt = &HF022 + fa_list_ol = &HF0CB + fa_list_ul = &HF0CA + fa_location_arrow = &HF124 + fa_lock = &HF023 + fa_long_arrow_down = &HF175 + fa_long_arrow_left = &HF177 + fa_long_arrow_right = &HF178 + fa_long_arrow_up = &HF176 + fa_low_vision = &HF2A8 + fa_magic = &HF0D0 + fa_magnet = &HF076 + fa_mail_forward = &HF064 + fa_mail_reply = &HF112 + fa_mail_reply_all = &HF122 + fa_male = &HF183 + fa_map = &HF279 + fa_map_marker = &HF041 + fa_map_o = &HF278 + fa_map_pin = &HF276 + fa_map_signs = &HF277 + fa_mars = &HF222 + fa_mars_double = &HF227 + fa_mars_stroke = &HF229 + fa_mars_stroke_h = &HF22B + fa_mars_stroke_v = &HF22A + fa_maxcdn = &HF136 + fa_meanpath = &HF20C + fa_medium = &HF23A + fa_medkit = &HF0FA + fa_meetup = &HF2E0 + fa_meh_o = &HF11A + fa_mercury = &HF223 + fa_microchip = &HF2DB + fa_microphone = &HF130 + fa_microphone_slash = &HF131 + fa_minus = &HF068 + fa_minus_circle = &HF056 + fa_minus_square = &HF146 + fa_minus_square_o = &HF147 + fa_mixcloud = &HF289 + fa_mobile = &HF10B + fa_mobile_phone = &HF10B + fa_modx = &HF285 + fa_money = &HF0D6 + fa_moon_o = &HF186 + fa_mortar_board = &HF19D + fa_motorcycle = &HF21C + fa_mouse_pointer = &HF245 + fa_music = &HF001 + fa_navicon = &HF0C9 + fa_neuter = &HF22C + fa_newspaper_o = &HF1EA + fa_object_group = &HF247 + fa_object_ungroup = &HF248 + fa_odnoklassniki = &HF263 + fa_odnoklassniki_square = &HF264 + fa_opencart = &HF23D + fa_openid = &HF19B + fa_opera = &HF26A + fa_optin_monster = &HF23C + fa_outdent = &HF03B + fa_pagelines = &HF18C + fa_paint_brush = &HF1FC + fa_paper_plane = &HF1D8 + fa_paper_plane_o = &HF1D9 + fa_paperclip = &HF0C6 + fa_paragraph = &HF1DD + fa_paste = &HF0EA + fa_pause = &HF04C + fa_pause_circle = &HF28B + fa_pause_circle_o = &HF28C + fa_paw = &HF1B0 + fa_paypal = &HF1ED + fa_pencil = &HF040 + fa_pencil_square = &HF14B + fa_pencil_square_o = &HF044 + fa_percent = &HF295 + fa_phone = &HF095 + fa_phone_square = &HF098 + fa_photo = &HF03E + fa_picture_o = &HF03E + fa_pie_chart = &HF200 + fa_pied_piper = &HF2AE + fa_pied_piper_alt = &HF1A8 + fa_pied_piper_pp = &HF1A7 + fa_pinterest = &HF0D2 + fa_pinterest_p = &HF231 + fa_pinterest_square = &HF0D3 + fa_plane = &HF072 + fa_play = &HF04B + fa_play_circle = &HF144 + fa_play_circle_o = &HF01D + fa_plug = &HF1E6 + fa_plus = &HF067 + fa_plus_circle = &HF055 + fa_plus_square = &HF0FE + fa_plus_square_o = &HF196 + fa_podcast = &HF2CE + fa_power_off = &HF011 + fa_print = &HF02F + fa_product_hunt = &HF288 + fa_puzzle_piece = &HF12E + fa_qq = &HF1D6 + fa_qrcode = &HF029 + fa_question = &HF128 + fa_question_circle = &HF059 + fa_question_circle_o = &HF29C + fa_quora = &HF2C4 + fa_quote_left = &HF10D + fa_quote_right = &HF10E + fa_ra = &HF1D0 + fa_random = &HF074 + fa_ravelry = &HF2D9 + fa_rebel = &HF1D0 + fa_recycle = &HF1B8 + fa_reddit = &HF1A1 + fa_reddit_alien = &HF281 + fa_reddit_square = &HF1A2 + fa_refresh = &HF021 + fa_registered = &HF25D + fa_remove = &HF00D + fa_renren = &HF18B + fa_reorder = &HF0C9 + fa_repeat = &HF01E + fa_reply = &HF112 + fa_reply_all = &HF122 + fa_resistance = &HF1D0 + fa_retweet = &HF079 + fa_rmb = &HF157 + fa_road = &HF018 + fa_rocket = &HF135 + fa_rotate_left = &HF0E2 + fa_rotate_right = &HF01E + fa_rouble = &HF158 + fa_rss = &HF09E + fa_rss_square = &HF143 + fa_rub = &HF158 + fa_ruble = &HF158 + fa_rupee = &HF156 + fa_s15 = &HF2CD + fa_safari = &HF267 + fa_save = &HF0C7 + fa_scissors = &HF0C4 + fa_scribd = &HF28A + fa_search = &HF002 + fa_search_minus = &HF010 + fa_search_plus = &HF00E + fa_sellsy = &HF213 + fa_send = &HF1D8 + fa_send_o = &HF1D9 + fa_server = &HF233 + fa_share = &HF064 + fa_share_alt = &HF1E0 + fa_share_alt_square = &HF1E1 + fa_share_square = &HF14D + fa_share_square_o = &HF045 + fa_shekel = &HF20B + fa_sheqel = &HF20B + fa_shield = &HF132 + fa_ship = &HF21A + fa_shirtsinbulk = &HF214 + fa_shopping_bag = &HF290 + fa_shopping_basket = &HF291 + fa_shopping_cart = &HF07A + fa_shower = &HF2CC + fa_sign_in = &HF090 + fa_sign_language = &HF2A7 + fa_sign_out = &HF08B + fa_signal = &HF012 + fa_signing = &HF2A7 + fa_simplybuilt = &HF215 + fa_sitemap = &HF0E8 + fa_skyatlas = &HF216 + fa_skype = &HF17E + fa_slack = &HF198 + fa_sliders = &HF1DE + fa_slideshare = &HF1E7 + fa_smile_o = &HF118 + fa_snapchat = &HF2AB + fa_snapchat_ghost = &HF2AC + fa_snapchat_square = &HF2AD + fa_snowflake_o = &HF2DC + fa_soccer_ball_o = &HF1E3 + fa_sort = &HF0DC + fa_sort_alpha_asc = &HF15D + fa_sort_alpha_desc = &HF15E + fa_sort_amount_asc = &HF160 + fa_sort_amount_desc = &HF161 + fa_sort_asc = &HF0DE + fa_sort_desc = &HF0DD + fa_sort_down = &HF0DD + fa_sort_numeric_asc = &HF162 + fa_sort_numeric_desc = &HF163 + fa_sort_up = &HF0DE + fa_soundcloud = &HF1BE + fa_space_shuttle = &HF197 + fa_spinner = &HF110 + fa_spoon = &HF1B1 + fa_spotify = &HF1BC + fa_square = &HF0C8 + fa_square_o = &HF096 + fa_stack_exchange = &HF18D + fa_stack_overflow = &HF16C + fa_star = &HF005 + fa_star_half = &HF089 + fa_star_half_empty = &HF123 + fa_star_half_full = &HF123 + fa_star_half_o = &HF123 + fa_star_o = &HF006 + fa_steam = &HF1B6 + fa_steam_square = &HF1B7 + fa_step_backward = &HF048 + fa_step_forward = &HF051 + fa_stethoscope = &HF0F1 + fa_sticky_note = &HF249 + fa_sticky_note_o = &HF24A + fa_stop = &HF04D + fa_stop_circle = &HF28D + fa_stop_circle_o = &HF28E + fa_street_view = &HF21D + fa_strikethrough = &HF0CC + fa_stumbleupon = &HF1A4 + fa_stumbleupon_circle = &HF1A3 + fa_subscript = &HF12C + fa_subway = &HF239 + fa_suitcase = &HF0F2 + fa_sun_o = &HF185 + fa_superpowers = &HF2DD + fa_superscript = &HF12B + fa_support = &HF1CD + fa_table = &HF0CE + fa_tablet = &HF10A + fa_tachometer = &HF0E4 + fa_tag = &HF02B + fa_tags = &HF02C + fa_tasks = &HF0AE + fa_taxi = &HF1BA + fa_telegram = &HF2C6 + fa_television = &HF26C + fa_tencent_weibo = &HF1D5 + fa_terminal = &HF120 + fa_text_height = &HF034 + fa_text_width = &HF035 + fa_th = &HF00A + fa_th_large = &HF009 + fa_th_list = &HF00B + fa_themeisle = &HF2B2 + fa_thermometer = &HF2C7 + fa_thermometer_0 = &HF2CB + fa_thermometer_1 = &HF2CA + fa_thermometer_2 = &HF2C9 + fa_thermometer_3 = &HF2C8 + fa_thermometer_4 = &HF2C7 + fa_thermometer_empty = &HF2CB + fa_thermometer_full = &HF2C7 + fa_thermometer_half = &HF2C9 + fa_thermometer_quarter = &HF2CA + fa_thermometer_three_quarters = &HF2C8 + fa_thumb_tack = &HF08D + fa_thumbs_down = &HF165 + fa_thumbs_o_down = &HF088 + fa_thumbs_o_up = &HF087 + fa_thumbs_up = &HF164 + fa_ticket = &HF145 + fa_times = &HF00D + fa_times_circle = &HF057 + fa_times_circle_o = &HF05C + fa_times_rectangle = &HF2D3 + fa_times_rectangle_o = &HF2D4 + fa_tint = &HF043 + fa_toggle_down = &HF150 + fa_toggle_left = &HF191 + fa_toggle_off = &HF204 + fa_toggle_on = &HF205 + fa_toggle_right = &HF152 + fa_toggle_up = &HF151 + fa_trademark = &HF25C + fa_train = &HF238 + fa_transgender = &HF224 + fa_transgender_alt = &HF225 + fa_trash = &HF1F8 + fa_trash_o = &HF014 + fa_tree = &HF1BB + fa_trello = &HF181 + fa_tripadvisor = &HF262 + fa_trophy = &HF091 + fa_truck = &HF0D1 + fa_try = &HF195 + fa_tty = &HF1E4 + fa_tumblr = &HF173 + fa_tumblr_square = &HF174 + fa_turkish_lira = &HF195 + fa_tv = &HF26C + fa_twitch = &HF1E8 + fa_twitter = &HF099 + fa_twitter_square = &HF081 + fa_umbrella = &HF0E9 + fa_underline = &HF0CD + fa_undo = &HF0E2 + fa_universal_access = &HF29A + fa_university = &HF19C + fa_unlink = &HF127 + fa_unlock = &HF09C + fa_unlock_alt = &HF13E + fa_unsorted = &HF0DC + fa_upload = &HF093 + fa_usb = &HF287 + fa_usd = &HF155 + fa_user = &HF007 + fa_user_circle = &HF2BD + fa_user_circle_o = &HF2BE + fa_user_md = &HF0F0 + fa_user_o = &HF2C0 + fa_user_plus = &HF234 + fa_user_secret = &HF21B + fa_user_times = &HF235 + fa_users = &HF0C0 + fa_vcard = &HF2BB + fa_vcard_o = &HF2BC + fa_venus = &HF221 + fa_venus_double = &HF226 + fa_venus_mars = &HF228 + fa_viacoin = &HF237 + fa_viadeo = &HF2A9 + fa_viadeo_square = &HF2AA + fa_video_camera = &HF03D + fa_vimeo = &HF27D + fa_vimeo_square = &HF194 + fa_vine = &HF1CA + fa_vk = &HF189 + fa_volume_control_phone = &HF2A0 + fa_volume_down = &HF027 + fa_volume_off = &HF026 + fa_volume_up = &HF028 + fa_warning = &HF071 + fa_wechat = &HF1D7 + fa_weibo = &HF18A + fa_weixin = &HF1D7 + fa_whatsapp = &HF232 + fa_wheelchair = &HF193 + fa_wheelchair_alt = &HF29B + fa_wifi = &HF1EB + fa_wikipedia_w = &HF266 + fa_window_close = &HF2D3 + fa_window_close_o = &HF2D4 + fa_window_maximize = &HF2D0 + fa_window_minimize = &HF2D1 + fa_window_restore = &HF2D2 + fa_windows = &HF17A + fa_won = &HF159 + fa_wordpress = &HF19A + fa_wpbeginner = &HF297 + fa_wpexplorer = &HF2DE + fa_wpforms = &HF298 + fa_wrench = &HF0AD + fa_xing = &HF168 + fa_xing_square = &HF169 + fa_y_combinator = &HF23B + fa_y_combinator_square = &HF1D4 + fa_yahoo = &HF19E + fa_yc = &HF23B + fa_yc_square = &HF1D4 + fa_yelp = &HF1E9 + fa_yen = &HF157 + fa_yoast = &HF2B1 + fa_youtube = &HF167 + fa_youtube_play = &HF16A + fa_youtube_square = &HF166 + End Enum +End Namespace \ No newline at end of file diff --git a/vbnet/vbnet.vbproj b/vbnet/vbnet.vbproj new file mode 100644 index 0000000..614c034 --- /dev/null +++ b/vbnet/vbnet.vbproj @@ -0,0 +1,122 @@ + + + + + Debug + AnyCPU + {AF1B21C5-28FC-4D47-AD0B-54F6A38391A6} + Library + vbnet + vbnet + 512 + Windows + v4.7 + + + + true + full + true + true + bin\Debug\ + + + 42030,42104,42105,42106,42107,42108,42109,42353,42354,42355 + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036 + + + pdbonly + false + true + true + bin\Release\ + + + 42030,42104,42105,42106,42107,42108,42109,42353,42354,42355 + 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036 + + + On + + + Binary + + + On + + + On + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Component + + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + + + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + \ No newline at end of file