├── .gitignore ├── LICENSE ├── README.md ├── SystemTrayAnimator.sln └── SystemTrayAnimator ├── AccurateTimer.cs ├── AutoStarter.cs ├── EventArgs.cs ├── Forms ├── AboutForm.Designer.cs ├── AboutForm.cs ├── AboutForm.resx ├── SettingsForm.Designer.cs ├── SettingsForm.cs └── SettingsForm.resx ├── Frame.cs ├── FrameList.cs ├── Images ├── Animations │ ├── Clock │ │ ├── Clock00.png │ │ ├── Clock01.png │ │ ├── Clock02.png │ │ ├── Clock03.png │ │ ├── Clock04.png │ │ ├── Clock05.png │ │ ├── Clock06.png │ │ ├── Clock07.png │ │ ├── Clock08.png │ │ ├── Clock09.png │ │ ├── Clock10.png │ │ ├── Clock11.png │ │ ├── Clock12.png │ │ ├── Clock13.png │ │ ├── Clock14.png │ │ ├── Clock15.png │ │ ├── Clock16.png │ │ ├── Clock17.png │ │ ├── Clock18.png │ │ ├── Clock19.png │ │ ├── Clock20.png │ │ ├── Clock21.png │ │ ├── Clock22.png │ │ ├── Clock23.png │ │ ├── Clock24.png │ │ ├── Clock25.png │ │ ├── Clock26.png │ │ ├── Clock27.png │ │ ├── Clock28.png │ │ ├── Clock29.png │ │ ├── Clock30.png │ │ ├── Clock31.png │ │ ├── Clock32.png │ │ ├── Clock33.png │ │ ├── Clock34.png │ │ ├── Clock35.png │ │ ├── Clock36.png │ │ ├── Clock37.png │ │ ├── Clock38.png │ │ ├── Clock39.png │ │ ├── Clock40.png │ │ ├── Clock41.png │ │ ├── Clock42.png │ │ ├── Clock43.png │ │ ├── Clock44.png │ │ ├── Clock45.png │ │ ├── Clock46.png │ │ ├── Clock47.png │ │ ├── Clock48.png │ │ ├── Clock49.png │ │ ├── Clock50.png │ │ ├── Clock51.png │ │ ├── Clock52.png │ │ ├── Clock53.png │ │ ├── Clock54.png │ │ ├── Clock55.png │ │ ├── Clock56.png │ │ ├── Clock57.png │ │ ├── Clock58.png │ │ └── Clock59.png │ ├── GreenSignal │ │ ├── GreenSignal00.png │ │ ├── GreenSignal01.png │ │ ├── GreenSignal02.png │ │ ├── GreenSignal03.png │ │ ├── GreenSignal04.png │ │ ├── GreenSignal05.png │ │ ├── GreenSignal06.png │ │ ├── GreenSignal07.png │ │ ├── GreenSignal08.png │ │ ├── GreenSignal09.png │ │ ├── GreenSignal10.png │ │ ├── GreenSignal11.png │ │ ├── GreenSignal12.png │ │ ├── GreenSignal13.png │ │ ├── GreenSignal14.png │ │ ├── GreenSignal15.png │ │ ├── GreenSignal16.png │ │ ├── GreenSignal17.png │ │ ├── GreenSignal18.png │ │ ├── GreenSignal19.png │ │ └── GreenSignal20.png │ ├── RedSignal │ │ ├── RedSignal00.png │ │ ├── RedSignal01.png │ │ ├── RedSignal02.png │ │ ├── RedSignal03.png │ │ ├── RedSignal04.png │ │ ├── RedSignal05.png │ │ ├── RedSignal06.png │ │ ├── RedSignal07.png │ │ ├── RedSignal08.png │ │ ├── RedSignal09.png │ │ ├── RedSignal10.png │ │ ├── RedSignal11.png │ │ ├── RedSignal12.png │ │ ├── RedSignal13.png │ │ ├── RedSignal14.png │ │ ├── RedSignal15.png │ │ ├── RedSignal16.png │ │ ├── RedSignal17.png │ │ ├── RedSignal18.png │ │ ├── RedSignal19.png │ │ └── RedSignal20.png │ ├── Timer │ │ ├── Timer_00_60.png │ │ ├── Timer_01_59.png │ │ ├── Timer_02_58.png │ │ ├── Timer_03_57.png │ │ ├── Timer_04_56.png │ │ ├── Timer_05_55.png │ │ ├── Timer_06_54.png │ │ ├── Timer_07_53.png │ │ ├── Timer_08_52.png │ │ ├── Timer_09_51.png │ │ ├── Timer_10_50.png │ │ ├── Timer_11_49.png │ │ ├── Timer_12_48.png │ │ ├── Timer_13_47.png │ │ ├── Timer_14_46.png │ │ ├── Timer_15_45.png │ │ ├── Timer_16_44.png │ │ ├── Timer_17_43.png │ │ ├── Timer_18_42.png │ │ ├── Timer_19_41.png │ │ ├── Timer_20_40.png │ │ ├── Timer_21_39.png │ │ ├── Timer_22_38.png │ │ ├── Timer_23_37.png │ │ ├── Timer_24_36.png │ │ ├── Timer_25_35.png │ │ ├── Timer_26_34.png │ │ ├── Timer_27_33.png │ │ ├── Timer_28_32.png │ │ ├── Timer_29_31.png │ │ ├── Timer_30_30.png │ │ ├── Timer_31_29.png │ │ ├── Timer_32_28.png │ │ ├── Timer_33_27.png │ │ ├── Timer_34_26.png │ │ ├── Timer_35_25.png │ │ ├── Timer_36_24.png │ │ ├── Timer_37_23.png │ │ ├── Timer_38_22.png │ │ ├── Timer_39_21.png │ │ ├── Timer_40_20.png │ │ ├── Timer_41_19.png │ │ ├── Timer_42_18.png │ │ ├── Timer_43_17.png │ │ ├── Timer_44_16.png │ │ ├── Timer_45_15.png │ │ ├── Timer_46_14.png │ │ ├── Timer_47_13.png │ │ ├── Timer_48_12.png │ │ ├── Timer_49_11.png │ │ ├── Timer_50_10.png │ │ ├── Timer_51_09.png │ │ ├── Timer_52_08.png │ │ ├── Timer_53_07.png │ │ ├── Timer_54_06.png │ │ ├── Timer_55_05.png │ │ ├── Timer_56_04.png │ │ ├── Timer_57_03.png │ │ ├── Timer_58_02.png │ │ ├── Timer_59_01.png │ │ └── Timer_60_00.png │ └── Umbrella │ │ ├── Umbrella01.png │ │ ├── Umbrella02.png │ │ ├── Umbrella03.png │ │ ├── Umbrella04.png │ │ ├── Umbrella05.png │ │ ├── Umbrella06.png │ │ ├── Umbrella07.png │ │ ├── Umbrella08.png │ │ ├── Umbrella09.png │ │ ├── Umbrella10.png │ │ ├── Umbrella11.png │ │ ├── Umbrella12.png │ │ ├── Umbrella13.png │ │ ├── Umbrella14.png │ │ ├── Umbrella15.png │ │ ├── Umbrella16.png │ │ ├── Umbrella17.png │ │ ├── Umbrella18.png │ │ ├── Umbrella19.png │ │ ├── Umbrella20.png │ │ ├── Umbrella21.png │ │ ├── Umbrella22.png │ │ ├── Umbrella23.png │ │ ├── Umbrella24.png │ │ ├── Umbrella25.png │ │ ├── Umbrella26.png │ │ ├── Umbrella27.png │ │ ├── Umbrella28.png │ │ ├── Umbrella29.png │ │ └── Umbrella30.png ├── Demo │ ├── Car.gif │ ├── Clock.gif │ ├── Cup.gif │ ├── GreenSignal.gif │ ├── Phone.gif │ ├── RedSignal.gif │ ├── Rocket.gif │ ├── Target.gif │ ├── Timer.gif │ ├── Umbrella.gif │ └── Walking.gif ├── Gifs │ ├── Walking.gif │ ├── car.gif │ ├── cup.gif │ ├── phone.gif │ ├── rocket.gif │ └── target.gif ├── SystemTrayAnimator.png └── SystemTrayAnimator128.png ├── MainApplicationContext.cs ├── Native ├── Enums │ ├── DpiAwarenessContext.cs.cs │ └── ProcessDpiAwareness.cs ├── SHCore.cs └── User32.cs ├── Program.cs ├── Properties ├── AssemblyInfo.cs ├── Resources.Designer.cs ├── Resources.resx ├── Settings.Designer.cs └── Settings.settings ├── Settings ├── ApplicationSettings.cs └── ApplicationSettingsFile.cs ├── SystemTrayAnimator.csproj ├── SystemTrayAnimator.ico ├── SystemTrayMenu.cs ├── Utils ├── AssemblyUtils.cs ├── FileUtils.cs └── SystemUtils.cs └── app.manifest /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.sln.docstates 8 | 9 | # Build results 10 | 11 | [Dd]ebug/ 12 | [Rr]elease/ 13 | [Rr]elease32/ 14 | [Rr]elease64/ 15 | x64/ 16 | build/ 17 | [Bb]in/ 18 | [Oo]bj/ 19 | .vs/ 20 | Application/ 21 | 22 | #NuGet 23 | packages/ 24 | 25 | # Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets 26 | !packages/*/build/ 27 | 28 | # MSTest test Results 29 | [Tt]est[Rr]esult*/ 30 | [Bb]uild[Ll]og.* 31 | 32 | *_i.c 33 | *_p.c 34 | *.ilk 35 | *.meta 36 | *.obj 37 | *.pch 38 | *.pdb 39 | *.pgc 40 | *.pgd 41 | *.rsp 42 | *.sbr 43 | *.tlb 44 | *.tli 45 | *.tlh 46 | *.tmp 47 | *.tmp_proj 48 | *.log 49 | *.vspscc 50 | *.vssscc 51 | .builds 52 | *.pidb 53 | *.log 54 | *.scc 55 | 56 | # Visual C++ cache files 57 | ipch/ 58 | *.aps 59 | *.ncb 60 | *.opensdf 61 | *.sdf 62 | *.cachefile 63 | 64 | # Visual Studio profiler 65 | *.psess 66 | *.vsp 67 | *.vspx 68 | 69 | # Guidance Automation Toolkit 70 | *.gpState 71 | 72 | # ReSharper is a .NET coding add-in 73 | _ReSharper*/ 74 | *.[Rr]e[Ss]harper 75 | 76 | # TeamCity is a build add-in 77 | _TeamCity* 78 | 79 | # DotCover is a Code Coverage Tool 80 | *.dotCover 81 | 82 | # NCrunch 83 | *.ncrunch* 84 | .*crunch*.local.xml 85 | 86 | # Installshield output folder 87 | [Ee]xpress/ 88 | 89 | # DocProject is a documentation generator add-in 90 | DocProject/buildhelp/ 91 | DocProject/Help/*.HxT 92 | DocProject/Help/*.HxC 93 | DocProject/Help/*.hhc 94 | DocProject/Help/*.hhk 95 | DocProject/Help/*.hhp 96 | DocProject/Help/Html2 97 | DocProject/Help/html 98 | 99 | # Click-Once directory 100 | publish/ 101 | 102 | # Publish Web Output 103 | *.Publish.xml 104 | 105 | # NuGet Packages Directory 106 | ## TODO: If you have NuGet Package Restore enabled, uncomment the next line 107 | #packages/ 108 | 109 | # Windows Azure Build Output 110 | csx 111 | *.build.csdef 112 | 113 | # Windows Store app package directory 114 | AppPackages/ 115 | 116 | # Others 117 | sql/ 118 | *.Cache 119 | ClientBin/ 120 | [Ss]tyle[Cc]op.* 121 | ~$* 122 | *~ 123 | *.dbmdl 124 | *.[Pp]ublish.xml 125 | *.pfx 126 | *.publishsettings 127 | 128 | # RIA/Silverlight projects 129 | Generated_Code/ 130 | 131 | # Backup & report files from converting an old project file to a newer 132 | # Visual Studio version. Backup files are not needed, because we have git ;-) 133 | _UpgradeReport_Files/ 134 | Backup*/ 135 | UpgradeLog*.XML 136 | UpgradeLog*.htm 137 | 138 | # SQL Server files 139 | App_Data/*.mdf 140 | App_Data/*.ldf 141 | 142 | 143 | #LightSwitch generated files 144 | GeneratedArtifacts/ 145 | _Pvt_Extensions/ 146 | ModelManifest.xml 147 | 148 | # ========================= 149 | # Windows detritus 150 | # ========================= 151 | 152 | # Windows image file caches 153 | Thumbs.db 154 | ehthumbs.db 155 | 156 | # Folder config file 157 | Desktop.ini 158 | 159 | # Recycle Bin used on file shares 160 | $RECYCLE.BIN/ 161 | 162 | # Mac desktop service store files 163 | .DS_Store 164 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Alexander Illarionov 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | logo 4 | 5 | # SystemTrayAnimator 6 | 7 |
8 | 9 | SystemTrayAnimator generates an animation using image files from a specified directory in the System Tray area. Simply copy your images into this directory, and SystemTrayAnimator will play them at a set speed. It not only looks great, but is also handy for keeping you informed about the progress or completion of lengthy tasks, such as transferring large files. You can designate a network drive or folder as the directory, allowing remote addition of images over the network. 10 | 11 | ## Demo 12 | 13 | Green Signal 10 FPS: 14 | ![GreenSignal](./SystemTrayAnimator/Images/Demo/GreenSignal.gif) 15 | 16 | Red Signal 10 FPS: 17 | ![RedSignal](./SystemTrayAnimator/Images/Demo/RedSignal.gif) 18 | 19 | Timer 1 FPS: 20 | ![Timer](./SystemTrayAnimator/Images/Demo/Timer.gif) 21 | 22 | Clock 1 FPS: 23 | ![Clock](./SystemTrayAnimator/Images/Demo/Clock.gif) 24 | 25 | Umbrella 10 FPS: 26 | ![Umbrella](./SystemTrayAnimator/Images/Demo/Umbrella.gif) 27 | 28 | ## Demo (Gif files) 29 | 30 | Rocket 20 FPS: 31 | ![Rocket](./SystemTrayAnimator/Images/Demo/Rocket.gif) 32 | 33 | Car 20 FPS: 34 | ![Car](./SystemTrayAnimator/Images/Demo/Car.gif) 35 | 36 | Walking 20 FPS: 37 | ![Walking](./SystemTrayAnimator/Images/Demo/Walking.gif) 38 | 39 | Cup 20 FPS: 40 | ![Cup](./SystemTrayAnimator/Images/Demo/Cup.gif) 41 | 42 | Phone 20 FPS: 43 | ![Phone](./SystemTrayAnimator/Images/Demo/Phone.gif) 44 | 45 | Target 20 FPS: 46 | ![Target](./SystemTrayAnimator/Images/Demo/Target.gif) 47 | 48 | ## Install 49 | 50 | * Download the [SystemTrayAnimator](https://github.com/AlexanderPro/SystemTrayAnimator/releases) in the zip file 51 | 52 | ## Requirements 53 | 54 | * OS Windows XP SP3 and later. Supports x86 and x64 systems. 55 | * .NET Framework 4.0 56 | 57 | ## Files 58 | 59 | * SystemTrayAnimator.exe 60 | * SystemTrayAnimator.xml (It is placed in roaming user directory. If you are planing to use SystemTrayAnimator as a portable app, then copy the file to the directory with SystemTrayAnimator.exe) -------------------------------------------------------------------------------- /SystemTrayAnimator.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.34601.136 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SystemTrayAnimator", "SystemTrayAnimator\SystemTrayAnimator.csproj", "{669B2C92-1383-4FD2-8C7F-B424D7DEE4C3}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {669B2C92-1383-4FD2-8C7F-B424D7DEE4C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {669B2C92-1383-4FD2-8C7F-B424D7DEE4C3}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {669B2C92-1383-4FD2-8C7F-B424D7DEE4C3}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {669B2C92-1383-4FD2-8C7F-B424D7DEE4C3}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {B472C29E-6A28-40FE-A666-CBBC96DA813A} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /SystemTrayAnimator/AccurateTimer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Threading; 3 | using System.Runtime.InteropServices; 4 | 5 | namespace SystemTrayAnimator 6 | { 7 | class AccurateTimer 8 | { 9 | private const int EVENT_TYPE = 1; 10 | 11 | private delegate void TimerEventDelegate(int id, int msg, IntPtr user, int dw1, int dw2); 12 | 13 | [DllImport("winmm.dll")] 14 | private static extern int timeBeginPeriod(int msec); 15 | 16 | [DllImport("winmm.dll")] 17 | private static extern int timeEndPeriod(int msec); 18 | 19 | [DllImport("winmm.dll")] 20 | private static extern int timeSetEvent(int delay, int resolution, TimerEventDelegate handler, IntPtr user, int eventType); 21 | 22 | [DllImport("winmm.dll")] 23 | private static extern int timeKillEvent(int id); 24 | 25 | 26 | private int _timerId; 27 | private Action _action; 28 | private TimerEventDelegate _handler; 29 | private bool _started; 30 | 31 | public AccurateTimer(Action action) 32 | { 33 | _action = action; 34 | _handler = new TimerEventDelegate(TimerCallback); 35 | _started = false; 36 | } 37 | 38 | public void Start(int delay) 39 | { 40 | if (!_started) 41 | { 42 | timeBeginPeriod(1); 43 | _timerId = timeSetEvent(delay, 0, _handler, IntPtr.Zero, EVENT_TYPE); 44 | _started = true; 45 | } 46 | } 47 | 48 | public void Stop() 49 | { 50 | if (_started) 51 | { 52 | timeKillEvent(_timerId); 53 | timeEndPeriod(1); 54 | Thread.Sleep(100); 55 | _started = false; 56 | } 57 | } 58 | 59 | private void TimerCallback(int id, int msg, IntPtr user, int dw1, int dw2) 60 | { 61 | if (_timerId != 0) 62 | { 63 | _action(); 64 | } 65 | } 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /SystemTrayAnimator/AutoStarter.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.Win32; 2 | 3 | namespace SystemTrayAnimator 4 | { 5 | static class AutoStarter 6 | { 7 | private const string RUN_LOCATION = @"Software\Microsoft\Windows\CurrentVersion\Run"; 8 | 9 | public static void Enable(string keyName, string assemblyLocation) 10 | { 11 | using var key = Registry.CurrentUser.CreateSubKey(RUN_LOCATION); 12 | key.SetValue(keyName, assemblyLocation); 13 | } 14 | 15 | public static void Disable(string keyName) 16 | { 17 | using var key = Registry.CurrentUser.CreateSubKey(RUN_LOCATION); 18 | key.DeleteValue(keyName); 19 | } 20 | 21 | public static bool IsEnabled(string keyName, string assemblyLocation) 22 | { 23 | using var key = Registry.CurrentUser.OpenSubKey(RUN_LOCATION); 24 | if (key == null) 25 | { 26 | return false; 27 | } 28 | var value = (string)key.GetValue(keyName); 29 | if (string.IsNullOrEmpty(value)) 30 | { 31 | return false; 32 | } 33 | return (value == assemblyLocation); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /SystemTrayAnimator/EventArgs.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace SystemTrayAnimator 4 | { 5 | [Serializable] 6 | public class EventArgs : EventArgs 7 | { 8 | public T Entity { get; } 9 | 10 | public EventArgs(T entity) 11 | { 12 | Entity = entity; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Forms/AboutForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace SystemTrayAnimator.Forms 2 | { 3 | partial class AboutForm 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | /// Contains language strings. 30 | private void InitializeComponent() 31 | { 32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AboutForm)); 33 | this.lblProductName = new System.Windows.Forms.Label(); 34 | this.lblCopyright = new System.Windows.Forms.Label(); 35 | this.linkUrl = new System.Windows.Forms.LinkLabel(); 36 | this.btnOk = new System.Windows.Forms.Button(); 37 | this.pbImage = new System.Windows.Forms.PictureBox(); 38 | ((System.ComponentModel.ISupportInitialize)(this.pbImage)).BeginInit(); 39 | this.SuspendLayout(); 40 | // 41 | // lblProductName 42 | // 43 | this.lblProductName.AutoSize = true; 44 | this.lblProductName.Location = new System.Drawing.Point(152, 37); 45 | this.lblProductName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); 46 | this.lblProductName.Name = "lblProductName"; 47 | this.lblProductName.Size = new System.Drawing.Size(98, 17); 48 | this.lblProductName.TabIndex = 1; 49 | this.lblProductName.Text = "Product Name"; 50 | // 51 | // lblCopyright 52 | // 53 | this.lblCopyright.AutoSize = true; 54 | this.lblCopyright.Location = new System.Drawing.Point(152, 64); 55 | this.lblCopyright.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); 56 | this.lblCopyright.Name = "lblCopyright"; 57 | this.lblCopyright.Size = new System.Drawing.Size(68, 17); 58 | this.lblCopyright.TabIndex = 2; 59 | this.lblCopyright.Text = "Copyright"; 60 | // 61 | // linkUrl 62 | // 63 | this.linkUrl.AutoSize = true; 64 | this.linkUrl.Location = new System.Drawing.Point(152, 92); 65 | this.linkUrl.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); 66 | this.linkUrl.Name = "linkUrl"; 67 | this.linkUrl.Size = new System.Drawing.Size(36, 17); 68 | this.linkUrl.TabIndex = 3; 69 | this.linkUrl.TabStop = true; 70 | this.linkUrl.Text = "URL"; 71 | this.linkUrl.Click += new System.EventHandler(this.LinkClick); 72 | // 73 | // btnOk 74 | // 75 | this.btnOk.Location = new System.Drawing.Point(550, 37); 76 | this.btnOk.Margin = new System.Windows.Forms.Padding(4); 77 | this.btnOk.Name = "btnOk"; 78 | this.btnOk.Size = new System.Drawing.Size(115, 37); 79 | this.btnOk.TabIndex = 0; 80 | this.btnOk.Text = "Ok"; 81 | this.btnOk.UseVisualStyleBackColor = true; 82 | this.btnOk.Click += new System.EventHandler(this.ButtonOkClick); 83 | // 84 | // pbImage 85 | // 86 | this.pbImage.BackgroundImage = global::SystemTrayAnimator.Properties.Resources.SystemTrayAnimator128; 87 | this.pbImage.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch; 88 | this.pbImage.InitialImage = null; 89 | this.pbImage.Location = new System.Drawing.Point(5, 17); 90 | this.pbImage.Margin = new System.Windows.Forms.Padding(4); 91 | this.pbImage.Name = "pbImage"; 92 | this.pbImage.Size = new System.Drawing.Size(128, 128); 93 | this.pbImage.TabIndex = 4; 94 | this.pbImage.TabStop = false; 95 | // 96 | // AboutForm 97 | // 98 | this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); 99 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 100 | this.ClientSize = new System.Drawing.Size(680, 176); 101 | this.Controls.Add(this.pbImage); 102 | this.Controls.Add(this.btnOk); 103 | this.Controls.Add(this.linkUrl); 104 | this.Controls.Add(this.lblCopyright); 105 | this.Controls.Add(this.lblProductName); 106 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 107 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 108 | this.KeyPreview = true; 109 | this.Margin = new System.Windows.Forms.Padding(4); 110 | this.MaximizeBox = false; 111 | this.MinimizeBox = false; 112 | this.Name = "AboutForm"; 113 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 114 | this.Text = "About"; 115 | this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.KeyDownClick); 116 | ((System.ComponentModel.ISupportInitialize)(this.pbImage)).EndInit(); 117 | this.ResumeLayout(false); 118 | this.PerformLayout(); 119 | 120 | } 121 | 122 | #endregion 123 | 124 | private System.Windows.Forms.Label lblProductName; 125 | private System.Windows.Forms.Label lblCopyright; 126 | private System.Windows.Forms.LinkLabel linkUrl; 127 | private System.Windows.Forms.Button btnOk; 128 | private System.Windows.Forms.PictureBox pbImage; 129 | } 130 | } -------------------------------------------------------------------------------- /SystemTrayAnimator/Forms/AboutForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | using SystemTrayAnimator.Utils; 4 | 5 | namespace SystemTrayAnimator.Forms 6 | { 7 | partial class AboutForm : Form 8 | { 9 | private const string URL_SYSTEM_TRAY_ANIMATOR = "https://github.com/AlexanderPro/SystemTrayAnimator"; 10 | 11 | public AboutForm() 12 | { 13 | InitializeComponent(); 14 | Text = $"About {AssemblyUtils.AssemblyProductName}"; 15 | lblProductName.Text = $"{AssemblyUtils.AssemblyProductName} v{AssemblyUtils.AssemblyProductVersion}"; 16 | lblCopyright.Text = $"{AssemblyUtils.AssemblyCopyright} {AssemblyUtils.AssemblyCompany}"; 17 | linkUrl.Text = URL_SYSTEM_TRAY_ANIMATOR; 18 | } 19 | 20 | private void ButtonOkClick(object sender, EventArgs e) => Close(); 21 | 22 | private void LinkClick(object sender, EventArgs e) => SystemUtils.RunAs(SystemUtils.GetDefaultBrowserModuleName(), URL_SYSTEM_TRAY_ANIMATOR, true); 23 | 24 | private void KeyDownClick(object sender, KeyEventArgs e) 25 | { 26 | if (e.KeyValue == 13 || e.KeyValue == 27) 27 | { 28 | Close(); 29 | } 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Forms/SettingsForm.Designer.cs: -------------------------------------------------------------------------------- 1 | namespace SystemTrayAnimator.Forms 2 | { 3 | partial class SettingsForm 4 | { 5 | /// 6 | /// Required designer variable. 7 | /// 8 | private System.ComponentModel.IContainer components = null; 9 | 10 | /// 11 | /// Clean up any resources being used. 12 | /// 13 | /// true if managed resources should be disposed; otherwise, false. 14 | protected override void Dispose(bool disposing) 15 | { 16 | if (disposing && (components != null)) 17 | { 18 | components.Dispose(); 19 | } 20 | base.Dispose(disposing); 21 | } 22 | 23 | #region Windows Form Designer generated code 24 | 25 | /// 26 | /// Required method for Designer support - do not modify 27 | /// the contents of this method with the code editor. 28 | /// 29 | /// Contains language strings. 30 | private void InitializeComponent() 31 | { 32 | System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SettingsForm)); 33 | this.btnOk = new System.Windows.Forms.Button(); 34 | this.txtDirectoryName = new System.Windows.Forms.TextBox(); 35 | this.btnCancel = new System.Windows.Forms.Button(); 36 | this.txtFileExtensions = new System.Windows.Forms.TextBox(); 37 | this.lblDirectoryName = new System.Windows.Forms.Label(); 38 | this.lblFileExtensions = new System.Windows.Forms.Label(); 39 | this.chckIncludeSubdirectories = new System.Windows.Forms.CheckBox(); 40 | this.btnBrowse = new System.Windows.Forms.Button(); 41 | this.lblInterval = new System.Windows.Forms.Label(); 42 | this.txtInterval = new System.Windows.Forms.TextBox(); 43 | this.chkHighDpiSupport = new System.Windows.Forms.CheckBox(); 44 | this.chkUseDelayFromFirstFrame = new System.Windows.Forms.CheckBox(); 45 | this.SuspendLayout(); 46 | // 47 | // btnOk 48 | // 49 | this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 50 | this.btnOk.Location = new System.Drawing.Point(307, 310); 51 | this.btnOk.Margin = new System.Windows.Forms.Padding(4); 52 | this.btnOk.Name = "btnOk"; 53 | this.btnOk.Size = new System.Drawing.Size(98, 32); 54 | this.btnOk.TabIndex = 10; 55 | this.btnOk.Text = "Ok"; 56 | this.btnOk.UseVisualStyleBackColor = true; 57 | this.btnOk.Click += new System.EventHandler(this.ButtonOkClick); 58 | // 59 | // txtDirectoryName 60 | // 61 | this.txtDirectoryName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 62 | | System.Windows.Forms.AnchorStyles.Right))); 63 | this.txtDirectoryName.Location = new System.Drawing.Point(12, 41); 64 | this.txtDirectoryName.Name = "txtDirectoryName"; 65 | this.txtDirectoryName.Size = new System.Drawing.Size(457, 22); 66 | this.txtDirectoryName.TabIndex = 1; 67 | // 68 | // btnCancel 69 | // 70 | this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 71 | this.btnCancel.Location = new System.Drawing.Point(413, 310); 72 | this.btnCancel.Margin = new System.Windows.Forms.Padding(4); 73 | this.btnCancel.Name = "btnCancel"; 74 | this.btnCancel.Size = new System.Drawing.Size(99, 32); 75 | this.btnCancel.TabIndex = 11; 76 | this.btnCancel.Text = "Cancel"; 77 | this.btnCancel.UseVisualStyleBackColor = true; 78 | this.btnCancel.Click += new System.EventHandler(this.ButtonCancelClick); 79 | // 80 | // txtFileExtensions 81 | // 82 | this.txtFileExtensions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 83 | | System.Windows.Forms.AnchorStyles.Right))); 84 | this.txtFileExtensions.Location = new System.Drawing.Point(11, 132); 85 | this.txtFileExtensions.Name = "txtFileExtensions"; 86 | this.txtFileExtensions.Size = new System.Drawing.Size(501, 22); 87 | this.txtFileExtensions.TabIndex = 5; 88 | this.txtFileExtensions.TextChanged += new System.EventHandler(this.FileExtensionsTextChanged); 89 | // 90 | // lblDirectoryName 91 | // 92 | this.lblDirectoryName.AutoSize = true; 93 | this.lblDirectoryName.Location = new System.Drawing.Point(13, 18); 94 | this.lblDirectoryName.Name = "lblDirectoryName"; 95 | this.lblDirectoryName.Size = new System.Drawing.Size(156, 17); 96 | this.lblDirectoryName.TabIndex = 0; 97 | this.lblDirectoryName.Text = "Directory with icon files:"; 98 | // 99 | // lblFileExtensions 100 | // 101 | this.lblFileExtensions.AutoSize = true; 102 | this.lblFileExtensions.Location = new System.Drawing.Point(12, 112); 103 | this.lblFileExtensions.Name = "lblFileExtensions"; 104 | this.lblFileExtensions.Size = new System.Drawing.Size(124, 17); 105 | this.lblFileExtensions.TabIndex = 4; 106 | this.lblFileExtensions.Text = "Icon file extension:"; 107 | // 108 | // chckIncludeSubdirectories 109 | // 110 | this.chckIncludeSubdirectories.AutoSize = true; 111 | this.chckIncludeSubdirectories.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 112 | this.chckIncludeSubdirectories.Location = new System.Drawing.Point(12, 69); 113 | this.chckIncludeSubdirectories.Name = "chckIncludeSubdirectories"; 114 | this.chckIncludeSubdirectories.Size = new System.Drawing.Size(168, 21); 115 | this.chckIncludeSubdirectories.TabIndex = 3; 116 | this.chckIncludeSubdirectories.Text = "Include subdirectories"; 117 | this.chckIncludeSubdirectories.UseVisualStyleBackColor = true; 118 | // 119 | // btnBrowse 120 | // 121 | this.btnBrowse.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); 122 | this.btnBrowse.Location = new System.Drawing.Point(475, 41); 123 | this.btnBrowse.Name = "btnBrowse"; 124 | this.btnBrowse.Size = new System.Drawing.Size(38, 23); 125 | this.btnBrowse.TabIndex = 2; 126 | this.btnBrowse.Text = "..."; 127 | this.btnBrowse.UseVisualStyleBackColor = true; 128 | this.btnBrowse.Click += new System.EventHandler(this.ButtonBrowseClick); 129 | // 130 | // lblInterval 131 | // 132 | this.lblInterval.AutoSize = true; 133 | this.lblInterval.Location = new System.Drawing.Point(12, 177); 134 | this.lblInterval.Name = "lblInterval"; 135 | this.lblInterval.Size = new System.Drawing.Size(184, 17); 136 | this.lblInterval.TabIndex = 6; 137 | this.lblInterval.Text = "Interval between icons (ms):"; 138 | // 139 | // txtInterval 140 | // 141 | this.txtInterval.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 142 | | System.Windows.Forms.AnchorStyles.Right))); 143 | this.txtInterval.Location = new System.Drawing.Point(11, 197); 144 | this.txtInterval.Name = "txtInterval"; 145 | this.txtInterval.Size = new System.Drawing.Size(501, 22); 146 | this.txtInterval.TabIndex = 7; 147 | // 148 | // chkHighDpiSupport 149 | // 150 | this.chkHighDpiSupport.AutoSize = true; 151 | this.chkHighDpiSupport.Location = new System.Drawing.Point(11, 273); 152 | this.chkHighDpiSupport.Name = "chkHighDpiSupport"; 153 | this.chkHighDpiSupport.Size = new System.Drawing.Size(199, 21); 154 | this.chkHighDpiSupport.TabIndex = 9; 155 | this.chkHighDpiSupport.Text = "Enable support of high DPI"; 156 | this.chkHighDpiSupport.UseVisualStyleBackColor = true; 157 | // 158 | // chkUseDelayFromFirstFrame 159 | // 160 | this.chkUseDelayFromFirstFrame.AutoSize = true; 161 | this.chkUseDelayFromFirstFrame.Font = new System.Drawing.Font("Microsoft Sans Serif", 7.8F, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, ((byte)(204))); 162 | this.chkUseDelayFromFirstFrame.Location = new System.Drawing.Point(11, 225); 163 | this.chkUseDelayFromFirstFrame.Name = "chkUseDelayFromFirstFrame"; 164 | this.chkUseDelayFromFirstFrame.Size = new System.Drawing.Size(297, 21); 165 | this.chkUseDelayFromFirstFrame.TabIndex = 8; 166 | this.chkUseDelayFromFirstFrame.Text = "Use a delay from the first frame as Interval"; 167 | this.chkUseDelayFromFirstFrame.UseVisualStyleBackColor = true; 168 | this.chkUseDelayFromFirstFrame.CheckedChanged += new System.EventHandler(this.UseDelayFromFirstFrameCheckedChanged); 169 | // 170 | // SettingsForm 171 | // 172 | this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); 173 | this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 174 | this.ClientSize = new System.Drawing.Size(525, 369); 175 | this.Controls.Add(this.chkUseDelayFromFirstFrame); 176 | this.Controls.Add(this.chkHighDpiSupport); 177 | this.Controls.Add(this.lblInterval); 178 | this.Controls.Add(this.txtInterval); 179 | this.Controls.Add(this.btnBrowse); 180 | this.Controls.Add(this.chckIncludeSubdirectories); 181 | this.Controls.Add(this.lblFileExtensions); 182 | this.Controls.Add(this.lblDirectoryName); 183 | this.Controls.Add(this.txtFileExtensions); 184 | this.Controls.Add(this.btnCancel); 185 | this.Controls.Add(this.txtDirectoryName); 186 | this.Controls.Add(this.btnOk); 187 | this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; 188 | this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); 189 | this.KeyPreview = true; 190 | this.Margin = new System.Windows.Forms.Padding(4); 191 | this.MaximizeBox = false; 192 | this.MinimizeBox = false; 193 | this.Name = "SettingsForm"; 194 | this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; 195 | this.Text = "Settings"; 196 | this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FormKeyDown); 197 | this.ResumeLayout(false); 198 | this.PerformLayout(); 199 | 200 | } 201 | 202 | #endregion 203 | private System.Windows.Forms.Button btnOk; 204 | private System.Windows.Forms.TextBox txtDirectoryName; 205 | private System.Windows.Forms.Button btnCancel; 206 | private System.Windows.Forms.TextBox txtFileExtensions; 207 | private System.Windows.Forms.Label lblDirectoryName; 208 | private System.Windows.Forms.Label lblFileExtensions; 209 | private System.Windows.Forms.CheckBox chckIncludeSubdirectories; 210 | private System.Windows.Forms.Button btnBrowse; 211 | private System.Windows.Forms.Label lblInterval; 212 | private System.Windows.Forms.TextBox txtInterval; 213 | private System.Windows.Forms.CheckBox chkHighDpiSupport; 214 | private System.Windows.Forms.CheckBox chkUseDelayFromFirstFrame; 215 | } 216 | } -------------------------------------------------------------------------------- /SystemTrayAnimator/Forms/SettingsForm.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | using System.IO; 4 | using SystemTrayAnimator.Settings; 5 | using SystemTrayAnimator.Utils; 6 | 7 | namespace SystemTrayAnimator.Forms 8 | { 9 | partial class SettingsForm : Form 10 | { 11 | private ApplicationSettings _settings; 12 | 13 | public event EventHandler> OkClick; 14 | 15 | public SettingsForm(ApplicationSettings settings) 16 | { 17 | _settings = settings; 18 | InitializeComponent(); 19 | InitializeControls(settings); 20 | UpdateControls(); 21 | } 22 | 23 | private void InitializeControls(ApplicationSettings settings) 24 | { 25 | txtDirectoryName.Text = settings.DirectoryName; 26 | txtFileExtensions.Text = settings.FileExtensions; 27 | chckIncludeSubdirectories.Checked = settings.IncludeSubdirectories; 28 | txtInterval.Text = settings.Interval.ToString(); 29 | chkUseDelayFromFirstFrame.Checked = settings.UseDelayFromFirstFrame; 30 | chkHighDpiSupport.Checked = settings.HighDpiSupport; 31 | DialogResult = DialogResult.Cancel; 32 | } 33 | 34 | private void ButtonOkClick(object sender, EventArgs e) 35 | { 36 | if (!Directory.Exists(txtDirectoryName.Text)) 37 | { 38 | txtDirectoryName.SelectAll(); 39 | txtDirectoryName.Focus(); 40 | MessageBox.Show($"The directory {txtDirectoryName.Text} does not exist.", "Error", MessageBoxButtons.OK); 41 | return; 42 | } 43 | 44 | if (string.IsNullOrWhiteSpace(txtFileExtensions.Text)) 45 | { 46 | txtFileExtensions.SelectAll(); 47 | txtFileExtensions.Focus(); 48 | MessageBox.Show($"Icon file extensions should be set.", "Error", MessageBoxButtons.OK); 49 | return; 50 | } 51 | 52 | if (!int.TryParse(txtInterval.Text, out var interval) || interval <= 0) 53 | { 54 | txtInterval.SelectAll(); 55 | txtInterval.Focus(); 56 | MessageBox.Show($"Interval between icons should be an integer and greater than zero.", "Error", MessageBoxButtons.OK); 57 | return; 58 | } 59 | 60 | var settings = new ApplicationSettings 61 | { 62 | DirectoryName = txtDirectoryName.Text, 63 | FileExtensions = txtFileExtensions.Text, 64 | IncludeSubdirectories = chckIncludeSubdirectories.Checked, 65 | Interval = interval, 66 | UseDelayFromFirstFrame = chkUseDelayFromFirstFrame.Checked, 67 | HighDpiSupport = chkHighDpiSupport.Checked, 68 | IsPaused = _settings.IsPaused 69 | }; 70 | DialogResult = DialogResult.OK; 71 | 72 | if (!settings.Equals(_settings)) 73 | { 74 | OkClick?.Invoke(this, new EventArgs(settings)); 75 | } 76 | 77 | Close(); 78 | } 79 | 80 | private void ButtonCancelClick(object sender, EventArgs e) 81 | { 82 | DialogResult = DialogResult.Cancel; 83 | Close(); 84 | } 85 | 86 | private void ButtonBrowseClick(object sender, EventArgs e) 87 | { 88 | using var dialog = new FolderBrowserDialog 89 | { 90 | SelectedPath = Directory.Exists(txtDirectoryName.Text) ? txtDirectoryName.Text : AssemblyUtils.AssemblyDirectory 91 | }; 92 | 93 | var result = dialog.ShowDialog(this); 94 | if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(dialog.SelectedPath)) 95 | { 96 | txtDirectoryName.Text = dialog.SelectedPath; 97 | } 98 | } 99 | 100 | private void UseDelayFromFirstFrameCheckedChanged(object sender, EventArgs e) 101 | { 102 | UpdateControls(); 103 | } 104 | 105 | private void FileExtensionsTextChanged(object sender, EventArgs e) 106 | { 107 | UpdateControls(); 108 | } 109 | 110 | private void FormKeyDown(object sender, KeyEventArgs e) 111 | { 112 | if (e.KeyValue == 13) 113 | { 114 | ButtonOkClick(sender, e); 115 | } 116 | 117 | if (e.KeyValue == 27) 118 | { 119 | ButtonCancelClick(sender, e); 120 | } 121 | } 122 | 123 | private void UpdateControls() 124 | { 125 | var isGifExtension = txtFileExtensions.Text.ToLower().Contains("gif"); 126 | chkUseDelayFromFirstFrame.Enabled = isGifExtension; 127 | txtInterval.Enabled = !chkUseDelayFromFirstFrame.Checked || !isGifExtension; 128 | } 129 | } 130 | } 131 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Frame.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Drawing; 4 | using System.Security.Cryptography; 5 | using SystemTrayAnimator.Native; 6 | 7 | namespace SystemTrayAnimator 8 | { 9 | class Frame : IDisposable 10 | { 11 | public string FileName { get; set; } 12 | 13 | public Icon Icon { get; set; } 14 | 15 | public IntPtr IconHandle { get; set; } = IntPtr.Zero; 16 | 17 | public static Frame Parse(string fileName) 18 | { 19 | var iconHandle = IntPtr.Zero; 20 | try 21 | { 22 | if (!File.Exists(fileName)) 23 | { 24 | return null; 25 | } 26 | using var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read); 27 | using var sha256 = SHA256.Create(); 28 | var hashBytes = sha256.ComputeHash(fileStream); 29 | fileStream.Position = 0; 30 | using var bitmap = new Bitmap(fileStream); 31 | iconHandle = bitmap.GetHicon(); 32 | var icon = Icon.FromHandle(iconHandle); 33 | return new Frame 34 | { 35 | FileName = fileName, 36 | Icon = icon, 37 | IconHandle = iconHandle 38 | }; 39 | } 40 | catch 41 | { 42 | if (iconHandle != IntPtr.Zero) 43 | { 44 | User32.DestroyIcon(iconHandle); 45 | iconHandle = IntPtr.Zero; 46 | } 47 | return null; 48 | } 49 | } 50 | 51 | public override bool Equals(object other) 52 | { 53 | if (other == null) 54 | { 55 | return false; 56 | } 57 | 58 | if (object.ReferenceEquals(this, other)) 59 | { 60 | return true; 61 | } 62 | 63 | if (GetType() != other.GetType()) 64 | { 65 | return false; 66 | } 67 | 68 | return Equals((Frame)other); 69 | } 70 | 71 | public bool Equals(Frame other) 72 | { 73 | if (other == null) 74 | { 75 | return false; 76 | } 77 | 78 | if (object.ReferenceEquals(this, other)) 79 | { 80 | return true; 81 | } 82 | 83 | if (GetType() != other.GetType()) 84 | { 85 | return false; 86 | } 87 | 88 | if (string.Compare(FileName, other.FileName, StringComparison.CurrentCultureIgnoreCase) != 0) 89 | { 90 | return false; 91 | } 92 | 93 | return true; 94 | } 95 | 96 | public override int GetHashCode() 97 | { 98 | var hashCode = 0; 99 | hashCode ^= FileName.GetHashCode(); 100 | hashCode ^= IconHandle.GetHashCode(); 101 | return hashCode; 102 | } 103 | 104 | public void Dispose() 105 | { 106 | Dispose(true); 107 | GC.SuppressFinalize(this); 108 | } 109 | 110 | protected virtual void Dispose(bool disposing) 111 | { 112 | if (disposing) 113 | { 114 | if (IconHandle != IntPtr.Zero) 115 | { 116 | User32.DestroyIcon(IconHandle); 117 | IconHandle = IntPtr.Zero; 118 | } 119 | Icon?.Dispose(); 120 | } 121 | } 122 | 123 | ~Frame() 124 | { 125 | Dispose(false); 126 | } 127 | } 128 | } 129 | -------------------------------------------------------------------------------- /SystemTrayAnimator/FrameList.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Drawing; 4 | using System.Drawing.Imaging; 5 | using System.Collections.Generic; 6 | using SystemTrayAnimator.Native; 7 | 8 | namespace SystemTrayAnimator 9 | { 10 | class FrameList : List 11 | { 12 | public static FrameList ParseFiles(params string[] fileNames) 13 | { 14 | var frameList = new FrameList(); 15 | foreach (var fileName in fileNames) 16 | { 17 | var fileExtension = Path.GetExtension(fileName); 18 | if (fileExtension.ToLower() == ".gif") 19 | { 20 | var iconHandle = IntPtr.Zero; 21 | try 22 | { 23 | using var image = Image.FromFile(fileName); 24 | var dimension = new FrameDimension(image.FrameDimensionsList[0]); 25 | int frameCount = image.GetFrameCount(dimension); 26 | for (var frameIndex = 0; frameIndex < frameCount; frameIndex++) 27 | { 28 | image.SelectActiveFrame(dimension, frameIndex); 29 | using var bitmap = new Bitmap(image); 30 | iconHandle = bitmap.GetHicon(); 31 | var icon = Icon.FromHandle(iconHandle); 32 | var frame = new Frame 33 | { 34 | FileName = fileName, 35 | Icon = icon, 36 | IconHandle = iconHandle 37 | }; 38 | frameList.Add(frame); 39 | } 40 | } 41 | catch 42 | { 43 | if (iconHandle != IntPtr.Zero) 44 | { 45 | User32.DestroyIcon(iconHandle); 46 | iconHandle = IntPtr.Zero; 47 | } 48 | } 49 | } 50 | else 51 | { 52 | var frame = Frame.Parse(fileName); 53 | if (frame != null) 54 | { 55 | frameList.Add(frame); 56 | } 57 | } 58 | } 59 | return frameList; 60 | } 61 | 62 | public override bool Equals(object other) 63 | { 64 | if (other == null) 65 | { 66 | return false; 67 | } 68 | 69 | if (object.ReferenceEquals(this, other)) 70 | { 71 | return true; 72 | } 73 | 74 | if (GetType() != other.GetType()) 75 | { 76 | return false; 77 | } 78 | 79 | return Equals((FrameList)other); 80 | } 81 | 82 | public bool Equals(FrameList other) 83 | { 84 | if (other == null) 85 | { 86 | return false; 87 | } 88 | 89 | if (object.ReferenceEquals(this, other)) 90 | { 91 | return true; 92 | } 93 | 94 | if (GetType() != other.GetType()) 95 | { 96 | return false; 97 | } 98 | 99 | if (Count != other.Count) 100 | { 101 | return false; 102 | } 103 | 104 | for (var i = 0; i < Count; i++) 105 | { 106 | if (!this[i].Equals(other[i])) 107 | { 108 | return false; 109 | } 110 | } 111 | 112 | return true; 113 | } 114 | 115 | public override int GetHashCode() 116 | { 117 | var hashCode = 0; 118 | foreach (var item in this) 119 | { 120 | hashCode ^= item.GetHashCode(); 121 | } 122 | return hashCode; 123 | } 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock00.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock01.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock02.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock03.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock04.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock05.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock06.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock07.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock08.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock09.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock10.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock11.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock12.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock13.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock14.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock15.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock16.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock17.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock18.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock19.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock20.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock21.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock22.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock23.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock24.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock25.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock26.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock27.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock28.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock29.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock30.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock31.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock32.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock33.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock34.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock35.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock36.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock37.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock38.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock39.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock40.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock41.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock42.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock43.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock44.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock45.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock46.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock47.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock48.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock49.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock50.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock51.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock52.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock53.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock54.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock55.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock56.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock57.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock58.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Clock/Clock59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Clock/Clock59.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal00.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal01.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal02.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal03.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal04.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal05.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal06.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal07.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal08.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal09.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal10.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal11.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal12.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal13.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal14.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal15.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal16.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal17.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal18.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal19.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/GreenSignal/GreenSignal20.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal00.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal01.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal02.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal03.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal04.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal05.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal06.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal07.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal08.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal09.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal10.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal11.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal12.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal13.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal14.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal15.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal16.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal17.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal18.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal19.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/RedSignal/RedSignal20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/RedSignal/RedSignal20.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_00_60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_00_60.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_01_59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_01_59.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_02_58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_02_58.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_03_57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_03_57.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_04_56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_04_56.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_05_55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_05_55.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_06_54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_06_54.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_07_53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_07_53.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_08_52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_08_52.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_09_51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_09_51.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_10_50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_10_50.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_11_49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_11_49.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_12_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_12_48.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_13_47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_13_47.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_14_46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_14_46.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_15_45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_15_45.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_16_44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_16_44.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_17_43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_17_43.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_18_42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_18_42.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_19_41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_19_41.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_20_40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_20_40.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_21_39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_21_39.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_22_38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_22_38.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_23_37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_23_37.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_24_36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_24_36.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_25_35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_25_35.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_26_34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_26_34.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_27_33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_27_33.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_28_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_28_32.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_29_31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_29_31.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_30_30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_30_30.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_31_29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_31_29.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_32_28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_32_28.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_33_27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_33_27.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_34_26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_34_26.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_35_25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_35_25.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_36_24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_36_24.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_37_23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_37_23.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_38_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_38_22.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_39_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_39_21.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_40_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_40_20.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_41_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_41_19.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_42_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_42_18.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_43_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_43_17.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_44_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_44_16.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_45_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_45_15.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_46_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_46_14.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_47_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_47_13.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_48_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_48_12.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_49_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_49_11.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_50_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_50_10.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_51_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_51_09.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_52_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_52_08.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_53_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_53_07.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_54_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_54_06.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_55_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_55_05.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_56_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_56_04.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_57_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_57_03.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_58_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_58_02.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_59_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_59_01.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Timer/Timer_60_00.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Timer/Timer_60_00.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella01.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella02.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella03.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella04.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella05.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella06.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella07.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella08.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella09.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella10.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella11.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella12.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella13.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella14.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella15.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella16.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella17.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella18.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella19.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella20.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella21.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella22.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella23.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella24.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella25.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella26.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella27.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella28.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella29.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Animations/Umbrella/Umbrella30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Animations/Umbrella/Umbrella30.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Demo/Car.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Demo/Car.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Demo/Clock.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Demo/Clock.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Demo/Cup.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Demo/Cup.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Demo/GreenSignal.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Demo/GreenSignal.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Demo/Phone.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Demo/Phone.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Demo/RedSignal.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Demo/RedSignal.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Demo/Rocket.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Demo/Rocket.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Demo/Target.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Demo/Target.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Demo/Timer.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Demo/Timer.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Demo/Umbrella.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Demo/Umbrella.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Demo/Walking.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Demo/Walking.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Gifs/Walking.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Gifs/Walking.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Gifs/car.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Gifs/car.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Gifs/cup.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Gifs/cup.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Gifs/phone.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Gifs/phone.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Gifs/rocket.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Gifs/rocket.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/Gifs/target.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/Gifs/target.gif -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/SystemTrayAnimator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/SystemTrayAnimator.png -------------------------------------------------------------------------------- /SystemTrayAnimator/Images/SystemTrayAnimator128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/Images/SystemTrayAnimator128.png -------------------------------------------------------------------------------- /SystemTrayAnimator/MainApplicationContext.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using System.IO; 4 | using System.Drawing; 5 | using System.Windows.Forms; 6 | using SystemTrayAnimator.Settings; 7 | using SystemTrayAnimator.Utils; 8 | using SystemTrayAnimator.Forms; 9 | 10 | namespace SystemTrayAnimator 11 | { 12 | class MainApplicationContext : ApplicationContext 13 | { 14 | private readonly object _lockObject; 15 | private readonly Icon _applicationIcon; 16 | private readonly SystemTrayMenu _systemTrayMenu; 17 | private readonly FileSystemWatcher _watcher; 18 | private readonly AccurateTimer _timer; 19 | private ApplicationSettings _settings; 20 | private FrameList _frames; 21 | private AboutForm _aboutForm; 22 | private SettingsForm _settingsForm; 23 | private int _frameIndex; 24 | private int? _gifInterval; 25 | 26 | public bool InitializationError { get; } 27 | 28 | public MainApplicationContext() 29 | { 30 | try 31 | { 32 | try 33 | { 34 | _settings = ApplicationSettingsFile.Read(); 35 | } 36 | catch (Exception e) 37 | { 38 | throw new Exception($"Failed to read the settings.", e); 39 | } 40 | 41 | if (!Directory.Exists(_settings.DirectoryName)) 42 | { 43 | throw new Exception($"The directory {_settings.DirectoryName ?? string.Empty} does not exist."); 44 | } 45 | 46 | _lockObject = new object(); 47 | _frameIndex = 0; 48 | _frames = new FrameList(); 49 | _timer = new AccurateTimer(ShowFrame); 50 | _applicationIcon = Properties.Resources.SystemTrayAnimator; 51 | 52 | // Enable support of high DPI 53 | if (_settings.HighDpiSupport) 54 | { 55 | SystemUtils.EnableHighDpiSupport(); 56 | } 57 | 58 | ReadDirectory(); 59 | ReadGifInterval(); 60 | 61 | _systemTrayMenu = new SystemTrayMenu(); 62 | _systemTrayMenu.MenuItemAutoStartClick += MenuItemAutoStartClick; 63 | _systemTrayMenu.MenuItemPauseClick += MenuItemPauseClick; 64 | _systemTrayMenu.MenuItemSettingsClick += MenuItemSettingsClick; 65 | _systemTrayMenu.MenuItemAboutClick += MenuItemAboutClick; 66 | _systemTrayMenu.MenuItemExitClick += MenuItemExitClick; 67 | _systemTrayMenu.Build(); 68 | _systemTrayMenu.CheckMenuItemAutoStart(AutoStarter.IsEnabled(AssemblyUtils.AssemblyProductName, AssemblyUtils.AssemblyLocation)); 69 | 70 | ShowFrame(); 71 | 72 | _watcher = new FileSystemWatcher(); 73 | _watcher.Path = _settings.DirectoryName; 74 | _watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Attributes; 75 | _watcher.IncludeSubdirectories = _settings.IncludeSubdirectories; 76 | _watcher.Filter = _settings.FileExtensions; 77 | _watcher.Created += (sender, e) => { ReadDirectory(); ReadGifInterval(); }; 78 | _watcher.Changed += (sender, e) => { ReadDirectory(); ReadGifInterval(); }; 79 | _watcher.Renamed += (sender, e) => { ReadDirectory(); ReadGifInterval(); }; 80 | _watcher.Deleted += (sender, e) => { ReadDirectory(); ReadGifInterval(); }; 81 | _watcher.EnableRaisingEvents = true; 82 | _timer.Start(_gifInterval ?? _settings.Interval); 83 | } 84 | catch (Exception ex) 85 | { 86 | InitializationError = true; 87 | _systemTrayMenu?.Dispose(); 88 | MessageBox.Show($"{ex.Message} {ex.InnerException?.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 89 | } 90 | } 91 | 92 | private void ReadDirectory() 93 | { 94 | var directoryName = string.Empty; 95 | var fileExtensions = string.Empty; 96 | var includeSubdirectories = false; 97 | lock (_lockObject) 98 | { 99 | directoryName = _settings.DirectoryName; 100 | fileExtensions = _settings.FileExtensions; 101 | includeSubdirectories = _settings.IncludeSubdirectories; 102 | } 103 | 104 | if (!Directory.Exists(directoryName)) 105 | { 106 | return; 107 | } 108 | 109 | var fileNames = Directory 110 | .EnumerateFiles(directoryName, fileExtensions, includeSubdirectories ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly) 111 | .OrderBy(x => x) 112 | .ToArray(); 113 | var frames = FrameList.ParseFiles(fileNames); 114 | lock (_lockObject) 115 | { 116 | if (!_frames.Equals(frames)) 117 | { 118 | ClearFrames(_frames); 119 | _frames = frames; 120 | _frameIndex = 0; 121 | } 122 | else 123 | { 124 | ClearFrames(frames); 125 | } 126 | } 127 | } 128 | 129 | private void ReadGifInterval() 130 | { 131 | lock (_lockObject) 132 | { 133 | var frame = _frames.FirstOrDefault(x => Path.GetExtension(x.FileName).ToLower() == ".gif"); 134 | if (frame != null && _settings.UseDelayFromFirstFrame) 135 | { 136 | using var image = Image.FromFile(frame.FileName); 137 | _gifInterval = SystemUtils.GetGifFrameDuration(image); 138 | } 139 | else 140 | { 141 | _gifInterval = null; 142 | } 143 | } 144 | } 145 | 146 | private void ShowFrame() 147 | { 148 | lock (_lockObject) 149 | { 150 | if (_frames.Count == 0) 151 | { 152 | _systemTrayMenu.Icon.Icon = _applicationIcon; 153 | } 154 | else if (_frames.Count == 1) 155 | { 156 | _systemTrayMenu.Icon.Icon = _frames[0].Icon; 157 | } 158 | else 159 | { 160 | _systemTrayMenu.Icon.Icon = _frames[_frameIndex].Icon; 161 | _frameIndex++; 162 | if (_frameIndex >= _frames.Count) 163 | { 164 | _frameIndex = 0; 165 | } 166 | } 167 | } 168 | } 169 | 170 | private void ClearFrames(FrameList frames) 171 | { 172 | foreach (var frame in frames) 173 | { 174 | frame.Dispose(); 175 | } 176 | frames.Clear(); 177 | } 178 | 179 | private void MenuItemAutoStartClick(object sender, EventArgs e) 180 | { 181 | var keyName = AssemblyUtils.AssemblyProductName; 182 | var assemblyLocation = AssemblyUtils.AssemblyLocation; 183 | var autoStartEnabled = AutoStarter.IsEnabled(keyName, assemblyLocation); 184 | if (autoStartEnabled) 185 | { 186 | AutoStarter.Disable(keyName); 187 | } 188 | else 189 | { 190 | AutoStarter.Enable(keyName, assemblyLocation); 191 | } 192 | ((ToolStripMenuItem)sender).Checked = !autoStartEnabled; 193 | } 194 | 195 | private void MenuItemPauseClick(object sender, EventArgs e) 196 | { 197 | lock (_lockObject) 198 | { 199 | if (_settings.IsPaused) 200 | { 201 | _settings.IsPaused = !_settings.IsPaused; 202 | _timer.Start(_gifInterval ?? _settings.Interval); 203 | ((ToolStripMenuItem)sender).Checked = _settings.IsPaused; 204 | } 205 | else 206 | { 207 | _settings.IsPaused = !_settings.IsPaused; 208 | _timer.Stop(); 209 | ((ToolStripMenuItem)sender).Checked = _settings.IsPaused; 210 | } 211 | } 212 | } 213 | 214 | private void MenuItemAboutClick(object sender, EventArgs e) 215 | { 216 | if (_aboutForm == null || _aboutForm.IsDisposed || !_aboutForm.IsHandleCreated) 217 | { 218 | _aboutForm = new AboutForm(); 219 | } 220 | _aboutForm.Show(); 221 | _aboutForm.Activate(); 222 | } 223 | 224 | private void MenuItemSettingsClick(object sender, EventArgs e) 225 | { 226 | if (_settingsForm == null || _settingsForm.IsDisposed || !_settingsForm.IsHandleCreated) 227 | { 228 | _settingsForm = new SettingsForm(_settings); 229 | _settingsForm.OkClick += (sender, e) => 230 | { 231 | lock (_lockObject) 232 | { 233 | _settings = e.Entity; 234 | ApplicationSettingsFile.Save(_settings); 235 | _watcher.Path = _settings.DirectoryName; 236 | _watcher.IncludeSubdirectories = _settings.IncludeSubdirectories; 237 | _watcher.Filter = _settings.FileExtensions; 238 | if (!_settings.IsPaused) 239 | { 240 | _timer.Stop(); 241 | } 242 | } 243 | ReadDirectory(); 244 | ReadGifInterval(); 245 | lock (_lockObject) 246 | { 247 | if (!_settings.IsPaused) 248 | { 249 | _timer.Start(_gifInterval ?? _settings.Interval); 250 | } 251 | } 252 | }; 253 | } 254 | 255 | _settingsForm.Show(); 256 | _settingsForm.Activate(); 257 | } 258 | 259 | private void MenuItemExitClick(object sender, EventArgs e) 260 | { 261 | _timer?.Stop(); 262 | _systemTrayMenu?.Dispose(); 263 | Application.Exit(); 264 | } 265 | } 266 | } -------------------------------------------------------------------------------- /SystemTrayAnimator/Native/Enums/DpiAwarenessContext.cs.cs: -------------------------------------------------------------------------------- 1 | namespace SystemTrayAnimator.Native.Enums 2 | { 3 | enum DpiAwarenessContext 4 | { 5 | DPI_AWARENESS_CONTEXT_UNAWARE = 16, 6 | DPI_AWARENESS_CONTEXT_SYSTEM_AWARE = 17, 7 | DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE = 18, 8 | DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 = 34 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Native/Enums/ProcessDpiAwareness.cs: -------------------------------------------------------------------------------- 1 | namespace SystemTrayAnimator.Native.Enums 2 | { 3 | enum ProcessDpiAwareness 4 | { 5 | Process_DPI_Unaware = 0, 6 | Process_System_DPI_Aware = 1, 7 | Process_Per_Monitor_DPI_Aware = 2 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Native/SHCore.cs: -------------------------------------------------------------------------------- 1 | using System.Runtime.InteropServices; 2 | using SystemTrayAnimator.Native.Enums; 3 | 4 | namespace SystemTrayAnimator.Native 5 | { 6 | static class SHCore 7 | { 8 | [DllImport("SHCore.dll", SetLastError = true)] 9 | public static extern bool SetProcessDpiAwareness(ProcessDpiAwareness processDpiAwareness); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Native/User32.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Runtime.InteropServices; 3 | using SystemTrayAnimator.Native.Enums; 4 | 5 | namespace SystemTrayAnimator.Native 6 | { 7 | static class User32 8 | { 9 | [DllImport("user32.dll", SetLastError = true)] 10 | public static extern bool SetProcessDpiAwarenessContext(DpiAwarenessContext context); 11 | 12 | [DllImport("user32.dll", SetLastError = true)] 13 | public static extern bool SetProcessDPIAware(); 14 | 15 | [DllImport("user32.dll")] 16 | public static extern bool DestroyIcon(IntPtr handle); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Windows.Forms; 3 | using System.Threading; 4 | using SystemTrayAnimator.Utils; 5 | 6 | namespace SystemTrayAnimator 7 | { 8 | static class Program 9 | { 10 | private static Mutex _mutex; 11 | 12 | [STAThread] 13 | static void Main() 14 | { 15 | _mutex = new Mutex(true, AssemblyUtils.AssemblyTitle, out var createNew); 16 | if (!createNew) 17 | { 18 | return; 19 | } 20 | 21 | AppDomain.CurrentDomain.UnhandledException += OnCurrentDomainUnhandledException; 22 | Application.ThreadException += OnThreadException; 23 | Application.EnableVisualStyles(); 24 | Application.SetCompatibleTextRenderingDefault(false); 25 | 26 | var context = new MainApplicationContext(); 27 | if (!context.InitializationError) 28 | { 29 | Application.Run(context); 30 | } 31 | 32 | _mutex.ReleaseMutex(); 33 | } 34 | 35 | static void OnCurrentDomainUnhandledException(object sender, UnhandledExceptionEventArgs e) 36 | { 37 | var ex = e.ExceptionObject as Exception; 38 | ex ??= new Exception("OnCurrentDomainUnhandledException"); 39 | OnThreadException(sender, new ThreadExceptionEventArgs(ex)); 40 | } 41 | 42 | static void OnThreadException(object sender, ThreadExceptionEventArgs e) => 43 | MessageBox.Show(e.Exception.ToString(), AssemblyUtils.AssemblyTitle, MessageBoxButtons.OK, MessageBoxIcon.Error); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Общие сведения об этой сборке предоставляются следующим набором 6 | // набора атрибутов. Измените значения этих атрибутов для изменения сведений, 7 | // связанных со сборкой. 8 | [assembly: AssemblyTitle("SystemTrayAnimator")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("SystemTrayAnimator")] 13 | [assembly: AssemblyCopyright("Copyright © 2025")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми 18 | // для компонентов COM. Если необходимо обратиться к типу в этой сборке через 19 | // COM, следует установить атрибут ComVisible в TRUE для этого типа. 20 | [assembly: ComVisible(false)] 21 | 22 | // Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM 23 | [assembly: Guid("669b2c92-1383-4fd2-8c7f-b424d7dee4c3")] 24 | 25 | // Сведения о версии сборки состоят из указанных ниже четырех значений: 26 | // 27 | // Основной номер версии 28 | // Дополнительный номер версии 29 | // Номер сборки 30 | // Редакция 31 | // 32 | // Можно задать все значения или принять номера сборки и редакции по умолчанию 33 | // используя "*", как показано ниже: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.1.0")] 36 | [assembly: AssemblyFileVersion("1.1.0")] 37 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Properties/Resources.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // Этот код создан программой. 4 | // Исполняемая версия:4.0.30319.42000 5 | // 6 | // Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае 7 | // повторной генерации кода. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | namespace SystemTrayAnimator.Properties { 12 | using System; 13 | 14 | 15 | /// 16 | /// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д. 17 | /// 18 | // Этот класс создан автоматически классом StronglyTypedResourceBuilder 19 | // с помощью такого средства, как ResGen или Visual Studio. 20 | // Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen 21 | // с параметром /str или перестройте свой проект VS. 22 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] 23 | [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] 24 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 25 | internal class Resources { 26 | 27 | private static global::System.Resources.ResourceManager resourceMan; 28 | 29 | private static global::System.Globalization.CultureInfo resourceCulture; 30 | 31 | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] 32 | internal Resources() { 33 | } 34 | 35 | /// 36 | /// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом. 37 | /// 38 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 39 | internal static global::System.Resources.ResourceManager ResourceManager { 40 | get { 41 | if (object.ReferenceEquals(resourceMan, null)) { 42 | global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SystemTrayAnimator.Properties.Resources", typeof(Resources).Assembly); 43 | resourceMan = temp; 44 | } 45 | return resourceMan; 46 | } 47 | } 48 | 49 | /// 50 | /// Перезаписывает свойство CurrentUICulture текущего потока для всех 51 | /// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией. 52 | /// 53 | [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] 54 | internal static global::System.Globalization.CultureInfo Culture { 55 | get { 56 | return resourceCulture; 57 | } 58 | set { 59 | resourceCulture = value; 60 | } 61 | } 62 | 63 | /// 64 | /// Поиск локализованного ресурса типа System.Drawing.Icon, аналогичного (Значок). 65 | /// 66 | internal static System.Drawing.Icon SystemTrayAnimator { 67 | get { 68 | object obj = ResourceManager.GetObject("SystemTrayAnimator", resourceCulture); 69 | return ((System.Drawing.Icon)(obj)); 70 | } 71 | } 72 | 73 | /// 74 | /// Поиск локализованного ресурса типа System.Drawing.Bitmap. 75 | /// 76 | internal static System.Drawing.Bitmap SystemTrayAnimator128 { 77 | get { 78 | object obj = ResourceManager.GetObject("SystemTrayAnimator128", resourceCulture); 79 | return ((System.Drawing.Bitmap)(obj)); 80 | } 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Properties/Resources.resx: -------------------------------------------------------------------------------- 1 |  2 | 3 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | text/microsoft-resx 110 | 111 | 112 | 2.0 113 | 114 | 115 | System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 116 | 117 | 118 | System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 119 | 120 | 121 | 122 | ..\SystemTrayAnimator.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 123 | 124 | 125 | ..\Images\SystemTrayAnimator128.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 126 | 127 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Properties/Settings.Designer.cs: -------------------------------------------------------------------------------- 1 | //------------------------------------------------------------------------------ 2 | // 3 | // This code was generated by a tool. 4 | // Runtime Version:4.0.30319.42000 5 | // 6 | // Changes to this file may cause incorrect behavior and will be lost if 7 | // the code is regenerated. 8 | // 9 | //------------------------------------------------------------------------------ 10 | 11 | 12 | namespace SystemTrayAnimator.Properties 13 | { 14 | [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] 15 | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] 16 | internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase 17 | { 18 | 19 | private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); 20 | 21 | public static Settings Default 22 | { 23 | get 24 | { 25 | return defaultInstance; 26 | } 27 | } 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Properties/Settings.settings: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Settings/ApplicationSettings.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using SystemTrayAnimator.Utils; 4 | 5 | namespace SystemTrayAnimator.Settings 6 | { 7 | public class ApplicationSettings : ICloneable 8 | { 9 | public const string DefaultDirectoryName = "Images"; 10 | public const bool DefaultIncludeSubdirectories = false; 11 | public const string DefaultFileExtensions = "*.gif"; 12 | public const int DefaultIntervalInMilliseconds = 50; 13 | public const bool DefaultUseDelayFromFirstFrame = false; 14 | public const bool DefaultHighDpiSupport = true; 15 | 16 | public string DirectoryName { get; set; } 17 | 18 | public bool IncludeSubdirectories { get; set; } 19 | 20 | public string FileExtensions { get; set; } 21 | 22 | public int Interval { get; set; } 23 | 24 | public bool UseDelayFromFirstFrame { get; set; } 25 | 26 | public bool HighDpiSupport { get; set; } 27 | 28 | public bool IsPaused { get; set; } 29 | 30 | public ApplicationSettings() 31 | { 32 | DirectoryName = Path.Combine(AssemblyUtils.AssemblyDirectory, DefaultDirectoryName); 33 | IncludeSubdirectories = DefaultIncludeSubdirectories; 34 | FileExtensions = DefaultFileExtensions; 35 | Interval = DefaultIntervalInMilliseconds; 36 | UseDelayFromFirstFrame = DefaultUseDelayFromFirstFrame; 37 | HighDpiSupport = DefaultHighDpiSupport; 38 | } 39 | 40 | public object Clone() => new ApplicationSettings 41 | { 42 | DirectoryName = DirectoryName, 43 | IncludeSubdirectories = IncludeSubdirectories, 44 | FileExtensions = FileExtensions, 45 | Interval = Interval, 46 | UseDelayFromFirstFrame = UseDelayFromFirstFrame, 47 | HighDpiSupport = HighDpiSupport 48 | }; 49 | 50 | public override bool Equals(object other) 51 | { 52 | if (other == null) 53 | { 54 | return false; 55 | } 56 | 57 | if (object.ReferenceEquals(this, other)) 58 | { 59 | return true; 60 | } 61 | 62 | if (GetType() != other.GetType()) 63 | { 64 | return false; 65 | } 66 | 67 | return Equals((ApplicationSettings)other); 68 | } 69 | 70 | public bool Equals(ApplicationSettings other) 71 | { 72 | if (other == null) 73 | { 74 | return false; 75 | } 76 | 77 | if (object.ReferenceEquals(this, other)) 78 | { 79 | return true; 80 | } 81 | 82 | if (GetType() != other.GetType()) 83 | { 84 | return false; 85 | } 86 | 87 | if (string.Compare(DirectoryName, other.DirectoryName, StringComparison.CurrentCultureIgnoreCase) != 0 || 88 | string.Compare(FileExtensions, other.FileExtensions, StringComparison.CurrentCultureIgnoreCase) != 0) 89 | { 90 | return false; 91 | } 92 | 93 | if (IncludeSubdirectories != other.IncludeSubdirectories || Interval != other.Interval || 94 | UseDelayFromFirstFrame != other.UseDelayFromFirstFrame || HighDpiSupport != other.HighDpiSupport) 95 | { 96 | return false; 97 | } 98 | 99 | return true; 100 | } 101 | 102 | public override int GetHashCode() 103 | { 104 | var hashCode = 0; 105 | hashCode ^= DirectoryName.GetHashCode(); 106 | hashCode ^= IncludeSubdirectories.GetHashCode(); 107 | hashCode ^= FileExtensions.GetHashCode(); 108 | hashCode ^= Interval.GetHashCode(); 109 | hashCode ^= UseDelayFromFirstFrame.GetHashCode(); 110 | hashCode ^= HighDpiSupport.GetHashCode(); 111 | return hashCode; 112 | } 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Settings/ApplicationSettingsFile.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.IO; 3 | using System.Xml.Linq; 4 | using System.Xml.XPath; 5 | using SystemTrayAnimator.Utils; 6 | 7 | namespace SystemTrayAnimator.Settings 8 | { 9 | static class ApplicationSettingsFile 10 | { 11 | public static ApplicationSettings Read() 12 | { 13 | if (GetCurrentDirectoryFile().Exists) 14 | { 15 | return ReadFromCurrentDirectoryFile(); 16 | } 17 | else if (GetProfileFile().Exists) 18 | { 19 | return ReadFromProfileFile(); 20 | } 21 | else 22 | { 23 | var settings = new ApplicationSettings(); 24 | SaveToProfileFile(settings); 25 | return settings; 26 | } 27 | } 28 | 29 | public static void Save(ApplicationSettings settings) 30 | { 31 | if (GetCurrentDirectoryFile().Exists) 32 | { 33 | SaveToCurrentDirectoryFile(settings); 34 | } 35 | else 36 | { 37 | SaveToProfileFile(settings); 38 | } 39 | } 40 | 41 | private static FileInfo GetCurrentDirectoryFile() 42 | { 43 | var fileName = Path.Combine(AssemblyUtils.AssemblyDirectory, $"{AssemblyUtils.AssemblyTitle}.xml"); 44 | return new FileInfo(fileName); 45 | } 46 | 47 | private static FileInfo GetProfileFile() 48 | { 49 | var directoryName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), AssemblyUtils.AssemblyTitle, AssemblyUtils.AssemblyProductVersion); 50 | var fileName = Path.Combine(directoryName, $"{AssemblyUtils.AssemblyTitle}.xml"); 51 | return new FileInfo(fileName); 52 | } 53 | 54 | private static ApplicationSettings ReadFromProfileFile() 55 | { 56 | var fileInfo = GetProfileFile(); 57 | using var stream = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 58 | return Read(stream); 59 | } 60 | 61 | private static ApplicationSettings ReadFromCurrentDirectoryFile() 62 | { 63 | var fileInfo = GetCurrentDirectoryFile(); 64 | using var stream = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 65 | return Read(stream); 66 | } 67 | 68 | private static void SaveToProfileFile(ApplicationSettings settings) 69 | { 70 | var fileInfo = GetProfileFile(); 71 | if (!Directory.Exists(fileInfo.Directory.FullName)) 72 | { 73 | Directory.CreateDirectory(fileInfo.Directory.FullName); 74 | } 75 | Save(fileInfo.FullName, settings); 76 | } 77 | 78 | private static void SaveToCurrentDirectoryFile(ApplicationSettings settings) 79 | { 80 | var fileInfo = GetCurrentDirectoryFile(); 81 | Save(fileInfo.FullName, settings); 82 | } 83 | 84 | private static ApplicationSettings Read(Stream stream) 85 | { 86 | var settings = new ApplicationSettings(); 87 | var document = XDocument.Load(stream); 88 | var rootElement = document.XPathSelectElement("/systemTrayAnimator"); 89 | settings.DirectoryName = rootElement.XPathSelectElement("//directoryName")?.Value ?? ApplicationSettings.DefaultDirectoryName; 90 | settings.IncludeSubdirectories = rootElement.XPathSelectElement("//includeSubdirectories") != null ? rootElement.XPathSelectElement("//includeSubdirectories").Value.ToLower() == "true" : ApplicationSettings.DefaultIncludeSubdirectories; 91 | settings.FileExtensions = rootElement.XPathSelectElement("//fileExtensions")?.Value ?? ApplicationSettings.DefaultFileExtensions; 92 | settings.Interval = rootElement.XPathSelectElement("//interval") != null ? int.Parse(rootElement.XPathSelectElement("//interval").Value) : ApplicationSettings.DefaultIntervalInMilliseconds; 93 | settings.UseDelayFromFirstFrame = rootElement.XPathSelectElement("//useDelayFromFirstFrame") != null ? rootElement.XPathSelectElement("//useDelayFromFirstFrame").Value.ToLower() == "true" : ApplicationSettings.DefaultUseDelayFromFirstFrame; 94 | settings.HighDpiSupport = rootElement.XPathSelectElement("//highDpiSupport") != null ? rootElement.XPathSelectElement("//highDpiSupport").Value.ToLower() == "true" : ApplicationSettings.DefaultHighDpiSupport; 95 | return settings; 96 | } 97 | 98 | private static void Save(string fileName, ApplicationSettings settings) 99 | { 100 | var document = new XDocument(); 101 | document.Add(new XElement("systemTrayAnimator", 102 | new XElement("directoryName", settings.DirectoryName), 103 | new XElement("includeSubdirectories", settings.IncludeSubdirectories), 104 | new XElement("fileExtensions", settings.FileExtensions), 105 | new XElement("interval", settings.Interval), 106 | new XElement("useDelayFromFirstFrame", settings.UseDelayFromFirstFrame), 107 | new XElement("highDpiSupport", settings.HighDpiSupport))); 108 | FileUtils.Save(fileName, document); 109 | } 110 | } 111 | } -------------------------------------------------------------------------------- /SystemTrayAnimator/SystemTrayAnimator.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {669B2C92-1383-4FD2-8C7F-B424D7DEE4C3} 8 | WinExe 9 | SystemTrayAnimator 10 | SystemTrayAnimator 11 | v4.0 12 | 512 13 | true 14 | 9 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | 26 | 27 | AnyCPU 28 | pdbonly 29 | true 30 | bin\Release\ 31 | TRACE 32 | prompt 33 | 4 34 | 35 | 36 | SystemTrayAnimator.ico 37 | 38 | 39 | app.manifest 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | Form 59 | 60 | 61 | AboutForm.cs 62 | 63 | 64 | Form 65 | 66 | 67 | SettingsForm.cs 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | AboutForm.cs 86 | 87 | 88 | SettingsForm.cs 89 | 90 | 91 | ResXFileCodeGenerator 92 | Resources.Designer.cs 93 | Designer 94 | 95 | 96 | True 97 | Resources.resx 98 | True 99 | 100 | 101 | 102 | SettingsSingleFileGenerator 103 | Settings.Designer.cs 104 | 105 | 106 | True 107 | Settings.settings 108 | True 109 | 110 | 111 | 112 | 113 | Always 114 | 115 | 116 | Always 117 | 118 | 119 | Always 120 | 121 | 122 | Always 123 | 124 | 125 | Always 126 | 127 | 128 | Always 129 | 130 | 131 | Always 132 | 133 | 134 | Always 135 | 136 | 137 | Always 138 | 139 | 140 | Always 141 | 142 | 143 | Always 144 | 145 | 146 | Always 147 | 148 | 149 | Always 150 | 151 | 152 | Always 153 | 154 | 155 | Always 156 | 157 | 158 | Always 159 | 160 | 161 | Always 162 | 163 | 164 | Always 165 | 166 | 167 | Always 168 | 169 | 170 | Always 171 | 172 | 173 | Always 174 | 175 | 176 | Always 177 | 178 | 179 | Always 180 | 181 | 182 | Always 183 | 184 | 185 | Always 186 | 187 | 188 | Always 189 | 190 | 191 | Always 192 | 193 | 194 | Always 195 | 196 | 197 | Always 198 | 199 | 200 | Always 201 | 202 | 203 | Always 204 | 205 | 206 | Always 207 | 208 | 209 | Always 210 | 211 | 212 | Always 213 | 214 | 215 | Always 216 | 217 | 218 | Always 219 | 220 | 221 | Always 222 | 223 | 224 | Always 225 | 226 | 227 | Always 228 | 229 | 230 | Always 231 | 232 | 233 | Always 234 | 235 | 236 | Always 237 | 238 | 239 | Always 240 | 241 | 242 | Always 243 | 244 | 245 | Always 246 | 247 | 248 | Always 249 | 250 | 251 | Always 252 | 253 | 254 | Always 255 | 256 | 257 | Always 258 | 259 | 260 | Always 261 | 262 | 263 | Always 264 | 265 | 266 | Always 267 | 268 | 269 | Always 270 | 271 | 272 | Always 273 | 274 | 275 | Always 276 | 277 | 278 | Always 279 | 280 | 281 | Always 282 | 283 | 284 | Always 285 | 286 | 287 | Always 288 | 289 | 290 | Always 291 | 292 | 293 | Always 294 | 295 | 296 | Always 297 | 298 | 299 | Always 300 | 301 | 302 | Always 303 | 304 | 305 | Always 306 | 307 | 308 | Always 309 | 310 | 311 | Always 312 | 313 | 314 | Always 315 | 316 | 317 | Always 318 | 319 | 320 | Always 321 | 322 | 323 | Always 324 | 325 | 326 | Always 327 | 328 | 329 | Always 330 | 331 | 332 | Always 333 | 334 | 335 | Always 336 | 337 | 338 | Always 339 | 340 | 341 | Always 342 | 343 | 344 | Always 345 | 346 | 347 | Always 348 | 349 | 350 | Always 351 | 352 | 353 | Always 354 | 355 | 356 | Always 357 | 358 | 359 | Always 360 | 361 | 362 | Always 363 | 364 | 365 | Always 366 | 367 | 368 | Always 369 | 370 | 371 | Always 372 | 373 | 374 | Always 375 | 376 | 377 | Always 378 | 379 | 380 | Always 381 | 382 | 383 | Always 384 | 385 | 386 | Always 387 | 388 | 389 | Always 390 | 391 | 392 | Always 393 | 394 | 395 | Always 396 | 397 | 398 | Always 399 | 400 | 401 | Always 402 | 403 | 404 | Always 405 | 406 | 407 | Always 408 | 409 | 410 | Always 411 | 412 | 413 | Always 414 | 415 | 416 | Always 417 | 418 | 419 | Always 420 | 421 | 422 | Always 423 | 424 | 425 | Always 426 | 427 | 428 | Always 429 | 430 | 431 | Always 432 | 433 | 434 | Always 435 | 436 | 437 | Always 438 | 439 | 440 | Always 441 | 442 | 443 | Always 444 | 445 | 446 | Always 447 | 448 | 449 | Always 450 | 451 | 452 | Always 453 | 454 | 455 | Always 456 | 457 | 458 | Always 459 | 460 | 461 | Always 462 | 463 | 464 | Always 465 | 466 | 467 | Always 468 | 469 | 470 | Always 471 | 472 | 473 | Always 474 | 475 | 476 | Always 477 | 478 | 479 | Always 480 | 481 | 482 | Always 483 | 484 | 485 | Always 486 | 487 | 488 | Always 489 | 490 | 491 | Always 492 | 493 | 494 | Always 495 | 496 | 497 | Always 498 | 499 | 500 | Always 501 | 502 | 503 | Always 504 | 505 | 506 | Always 507 | 508 | 509 | Always 510 | 511 | 512 | Always 513 | 514 | 515 | Always 516 | 517 | 518 | Always 519 | 520 | 521 | Always 522 | 523 | 524 | Always 525 | 526 | 527 | Always 528 | 529 | 530 | Always 531 | 532 | 533 | Always 534 | 535 | 536 | Always 537 | 538 | 539 | Always 540 | 541 | 542 | Always 543 | 544 | 545 | Always 546 | 547 | 548 | Always 549 | 550 | 551 | Always 552 | 553 | 554 | Always 555 | 556 | 557 | Always 558 | 559 | 560 | Always 561 | 562 | 563 | Always 564 | 565 | 566 | Always 567 | 568 | 569 | Always 570 | 571 | 572 | Always 573 | 574 | 575 | Always 576 | 577 | 578 | Always 579 | 580 | 581 | Always 582 | 583 | 584 | Always 585 | 586 | 587 | Always 588 | 589 | 590 | Always 591 | 592 | 593 | Always 594 | 595 | 596 | Always 597 | 598 | 599 | Always 600 | 601 | 602 | Always 603 | 604 | 605 | Always 606 | 607 | 608 | Always 609 | 610 | 611 | Always 612 | 613 | 614 | Always 615 | 616 | 617 | Always 618 | 619 | 620 | Always 621 | 622 | 623 | Always 624 | 625 | 626 | Always 627 | 628 | 629 | Always 630 | 631 | 632 | Always 633 | 634 | 635 | Always 636 | 637 | 638 | Always 639 | 640 | 641 | Always 642 | 643 | 644 | Always 645 | 646 | 647 | Always 648 | 649 | 650 | Always 651 | 652 | 653 | Always 654 | 655 | 656 | Always 657 | 658 | 659 | Always 660 | 661 | 662 | Always 663 | 664 | 665 | Always 666 | 667 | 668 | Always 669 | 670 | 671 | Always 672 | 673 | 674 | Always 675 | 676 | 677 | Always 678 | 679 | 680 | Always 681 | 682 | 683 | Always 684 | 685 | 686 | Always 687 | 688 | 689 | Always 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | Always 704 | 705 | 706 | Always 707 | 708 | 709 | Always 710 | 711 | 712 | Always 713 | 714 | 715 | Always 716 | 717 | 718 | Always 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | powershell Compress-Archive -Path '$(TargetDir)Images\Animations\' -DestinationPath '$(TargetDir)Images\Animations.zip' -Force 728 | powershell Compress-Archive -Path '$(TargetDir)Images\Gifs\' -DestinationPath '$(TargetDir)Images\Gifs.zip' -Force 729 | copy /Y "$(TargetDir)Images\Gifs\rocket.gif" "$(TargetDir)Images\" 730 | rd /S /Q "$(TargetDir)Images\Animations\" 731 | rd /S /Q "$(TargetDir)Images\Gifs\" 732 | 733 | 734 | 735 | 736 | 737 | -------------------------------------------------------------------------------- /SystemTrayAnimator/SystemTrayAnimator.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AlexanderPro/SystemTrayAnimator/4036cac6ef4939ae205be3319fa69225e075e1fa/SystemTrayAnimator/SystemTrayAnimator.ico -------------------------------------------------------------------------------- /SystemTrayAnimator/SystemTrayMenu.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.ComponentModel; 3 | using System.Drawing; 4 | using System.Windows.Forms; 5 | using SystemTrayAnimator.Utils; 6 | 7 | namespace SystemTrayAnimator 8 | { 9 | class SystemTrayMenu : IDisposable 10 | { 11 | private readonly ContextMenuStrip _systemTrayMenu; 12 | private readonly ToolStripMenuItem _menuItemAutoStart; 13 | private readonly ToolStripMenuItem _menuItemPause; 14 | private readonly ToolStripMenuItem _menuItemSettings; 15 | private readonly ToolStripMenuItem _menuItemAbout; 16 | private readonly ToolStripMenuItem _menuItemExit; 17 | private readonly ToolStripSeparator _menuItemSeparator1; 18 | private readonly ToolStripSeparator _menuItemSeparator2; 19 | private readonly NotifyIcon _icon; 20 | private bool _isBuilt; 21 | 22 | public event EventHandler MenuItemAutoStartClick; 23 | public event EventHandler MenuItemPauseClick; 24 | public event EventHandler MenuItemSettingsClick; 25 | public event EventHandler MenuItemAboutClick; 26 | public event EventHandler MenuItemExitClick; 27 | 28 | public NotifyIcon Icon => _icon; 29 | 30 | public SystemTrayMenu() 31 | { 32 | _menuItemAutoStart = new ToolStripMenuItem(); 33 | _menuItemPause = new ToolStripMenuItem(); 34 | _menuItemSettings = new ToolStripMenuItem(); 35 | _menuItemAbout = new ToolStripMenuItem(); 36 | _menuItemExit = new ToolStripMenuItem(); 37 | _menuItemSeparator1 = new ToolStripSeparator(); 38 | _menuItemSeparator2 = new ToolStripSeparator(); 39 | var components = new Container(); 40 | _systemTrayMenu = new ContextMenuStrip(components); 41 | _icon = new NotifyIcon(components); 42 | _isBuilt = false; 43 | } 44 | 45 | public void Build() 46 | { 47 | if (_isBuilt) 48 | { 49 | return; 50 | } 51 | 52 | _menuItemAutoStart.Name = "miAutoStart"; 53 | _menuItemAutoStart.Size = new Size(175, 22); 54 | _menuItemAutoStart.Text = "Auto start program"; 55 | _menuItemAutoStart.Click += (sender, e) => MenuItemAutoStartClick?.Invoke(sender, e); 56 | 57 | _menuItemPause.Name = "miPause"; 58 | _menuItemPause.Size = new Size(175, 22); 59 | _menuItemPause.Text = "Pause"; 60 | _menuItemPause.Click += (sender, e) => MenuItemPauseClick?.Invoke(sender, e); 61 | 62 | _menuItemSettings.Name = "miSettings"; 63 | _menuItemSettings.Size = new Size(175, 22); 64 | _menuItemSettings.Text = "Settings..."; 65 | _menuItemSettings.Click += (sender, e) => MenuItemSettingsClick?.Invoke(sender, e); 66 | 67 | _menuItemAbout.Name = "miAbout"; 68 | _menuItemAbout.Size = new Size(175, 22); 69 | _menuItemAbout.Text = "About"; 70 | _menuItemAbout.Click += (sender, e) => MenuItemAboutClick?.Invoke(sender, e); 71 | 72 | _menuItemExit.Name = "miExit"; 73 | _menuItemExit.Size = new Size(175, 22); 74 | _menuItemExit.Text = "Exit"; 75 | _menuItemExit.Click += (sender, e) => MenuItemExitClick?.Invoke(sender, e); 76 | 77 | _menuItemSeparator1.Name = "miSeparator1"; 78 | _menuItemSeparator1.Size = new Size(172, 6); 79 | 80 | _menuItemSeparator2.Name = "miSeparator2"; 81 | _menuItemSeparator2.Size = new Size(172, 6); 82 | 83 | _systemTrayMenu.Items.AddRange(new ToolStripItem[] { _menuItemAutoStart, _menuItemSeparator1, _menuItemPause, _menuItemSettings, _menuItemAbout, _menuItemSeparator2, _menuItemExit }); 84 | 85 | _systemTrayMenu.Name = AssemblyUtils.AssemblyTitle; 86 | _systemTrayMenu.Size = new Size(176, 80); 87 | 88 | _icon.ContextMenuStrip = _systemTrayMenu; 89 | _icon.Text = AssemblyUtils.AssemblyTitle; 90 | _icon.Visible = true; 91 | _icon.DoubleClick += (sender, e) => MenuItemSettingsClick?.Invoke(sender, e); 92 | 93 | _isBuilt = true; 94 | } 95 | 96 | public void CheckMenuItemAutoStart(bool check) 97 | { 98 | _menuItemAutoStart.Checked = check; 99 | } 100 | 101 | public void CheckMenuItemPause(bool check) 102 | { 103 | _menuItemPause.Checked = check; 104 | } 105 | 106 | public void Dispose() 107 | { 108 | Dispose(true); 109 | GC.SuppressFinalize(this); 110 | } 111 | 112 | protected virtual void Dispose(bool disposing) 113 | { 114 | if (disposing) 115 | { 116 | _menuItemAutoStart?.Dispose(); 117 | _menuItemPause?.Dispose(); 118 | _menuItemSettings?.Dispose(); 119 | _menuItemAbout?.Dispose(); 120 | _menuItemExit?.Dispose(); 121 | _menuItemSeparator1?.Dispose(); 122 | _menuItemSeparator2?.Dispose(); 123 | _systemTrayMenu?.Dispose(); 124 | _icon.Visible = false; 125 | _icon.Dispose(); 126 | } 127 | } 128 | 129 | ~SystemTrayMenu() 130 | { 131 | Dispose(false); 132 | } 133 | } 134 | } -------------------------------------------------------------------------------- /SystemTrayAnimator/Utils/AssemblyUtils.cs: -------------------------------------------------------------------------------- 1 | using System.IO; 2 | using System.Linq; 3 | using System.Reflection; 4 | 5 | namespace SystemTrayAnimator.Utils 6 | { 7 | static class AssemblyUtils 8 | { 9 | public static string AssemblyLocation => Assembly.GetExecutingAssembly().Location; 10 | 11 | public static string AssemblyDirectory => Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); 12 | 13 | public static string AssemblyVersion => Assembly.GetExecutingAssembly().GetName().Version.ToString(); 14 | 15 | public static string AssemblyTitle => Assembly 16 | .GetExecutingAssembly() 17 | .GetCustomAttributes(typeof(AssemblyTitleAttribute), false) 18 | .OfType() 19 | .FirstOrDefault()?.Title ?? string.Empty; 20 | 21 | public static string AssemblyProductName => Assembly 22 | .GetExecutingAssembly() 23 | .GetCustomAttributes(typeof(AssemblyProductAttribute), false) 24 | .OfType() 25 | .FirstOrDefault()?.Product ?? string.Empty; 26 | 27 | public static string AssemblyCopyright => Assembly 28 | .GetExecutingAssembly() 29 | .GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false) 30 | .OfType() 31 | .FirstOrDefault()?.Copyright ?? string.Empty; 32 | 33 | public static string AssemblyCompany => Assembly 34 | .GetExecutingAssembly() 35 | .GetCustomAttributes(typeof(AssemblyCompanyAttribute), false) 36 | .OfType() 37 | .FirstOrDefault()?.Company ?? string.Empty; 38 | 39 | public static string AssemblyProductVersion 40 | { 41 | get 42 | { 43 | var version = Assembly.GetExecutingAssembly().GetName().Version; 44 | return $"{version.Major}.{version.Minor}.{version.Build}"; 45 | } 46 | } 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Utils/FileUtils.cs: -------------------------------------------------------------------------------- 1 | using System.Text; 2 | using System.IO; 3 | using System.Xml.Linq; 4 | 5 | namespace SystemTrayAnimator.Utils 6 | { 7 | static class FileUtils 8 | { 9 | public static void Save(string fileName, XDocument document) 10 | { 11 | using var writer = new Utf8StringWriter(); 12 | document.Save(writer, SaveOptions.None); 13 | File.WriteAllText(fileName, writer.ToString()); 14 | } 15 | 16 | private class Utf8StringWriter : StringWriter 17 | { 18 | public override Encoding Encoding { get { return Encoding.UTF8; } } 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /SystemTrayAnimator/Utils/SystemUtils.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Diagnostics; 5 | using System.IO; 6 | using System.Drawing; 7 | using Microsoft.Win32; 8 | using SystemTrayAnimator.Native; 9 | using SystemTrayAnimator.Native.Enums; 10 | 11 | namespace SystemTrayAnimator.Utils 12 | { 13 | static class SystemUtils 14 | { 15 | public static void RunAs(string fileName, string arguments, bool showWindow, string workinDirectory = null) 16 | { 17 | var fullFileNames = GetFullPaths(fileName); 18 | if (fullFileNames.Any()) 19 | { 20 | var fullFileName = fullFileNames[0]; 21 | var process = new Process(); 22 | process.StartInfo.FileName = fullFileName; 23 | process.StartInfo.Arguments = arguments; 24 | process.StartInfo.WorkingDirectory = !string.IsNullOrEmpty(workinDirectory) ? workinDirectory : Path.GetDirectoryName(fullFileName); 25 | if (!showWindow) 26 | { 27 | process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; 28 | process.StartInfo.CreateNoWindow = true; 29 | } 30 | process.Start(); 31 | } 32 | } 33 | 34 | public static string GetDefaultBrowserModuleName() 35 | { 36 | var browserName = "iexplore.exe"; 37 | using var userChoiceKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice"); 38 | if (userChoiceKey == null) 39 | { 40 | return browserName; 41 | } 42 | 43 | var progIdValue = userChoiceKey.GetValue("Progid"); 44 | if (progIdValue == null) 45 | { 46 | return browserName; 47 | } 48 | 49 | var progId = progIdValue.ToString(); 50 | var path = progId + "\\shell\\open\\command"; 51 | using var pathKey = Registry.ClassesRoot.OpenSubKey(path); 52 | if (pathKey == null) 53 | { 54 | return browserName; 55 | } 56 | 57 | try 58 | { 59 | path = pathKey.GetValue(null).ToString().ToLower().Replace("\"", ""); 60 | const string exeSuffix = ".exe"; 61 | if (!path.EndsWith(exeSuffix)) 62 | { 63 | path = path.Substring(0, path.LastIndexOf(exeSuffix, StringComparison.Ordinal) + exeSuffix.Length); 64 | } 65 | return path; 66 | } 67 | catch 68 | { 69 | return browserName; 70 | } 71 | } 72 | 73 | private static List GetFullPaths(string fileName) 74 | { 75 | if (File.Exists(fileName)) 76 | { 77 | return new List { Path.GetFullPath(fileName) }; 78 | } 79 | 80 | var fullPaths = new List(); 81 | var values = Environment.GetEnvironmentVariable("PATH"); 82 | foreach (var path in values.Split(Path.PathSeparator)) 83 | { 84 | var fullPath = Path.Combine(path, fileName); 85 | if (File.Exists(fullPath)) 86 | { 87 | fullPaths.Add(fullPath); 88 | } 89 | } 90 | return fullPaths; 91 | } 92 | 93 | public static void EnableHighDpiSupport() 94 | { 95 | if (Environment.OSVersion.Version.Major <= 5) 96 | { 97 | return; 98 | } 99 | 100 | if (Environment.OSVersion.Version >= new Version(6, 3, 0)) // win 8.1 added support for per monitor dpi 101 | { 102 | if (Environment.OSVersion.Version >= new Version(10, 0, 15063)) // win 10 creators update added support for per monitor v2 103 | { 104 | User32.SetProcessDpiAwarenessContext(DpiAwarenessContext.DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2); 105 | } 106 | else 107 | { 108 | SHCore.SetProcessDpiAwareness(ProcessDpiAwareness.Process_Per_Monitor_DPI_Aware); 109 | } 110 | } 111 | else 112 | { 113 | User32.SetProcessDPIAware(); 114 | } 115 | } 116 | 117 | /// 118 | /// https://stackoverflow.com/questions/3785031/getting-the-frame-duration-of-an-animated-gif 119 | /// 120 | public static int GetGifFrameDuration(Image image) 121 | { 122 | // FrameDelay in libgdiplus 123 | var item = image.GetPropertyItem(0x5100); 124 | // Time is in milliseconds 125 | var duration = (item.Value[0] + item.Value[1] * 256) * 10; 126 | return duration; 127 | } 128 | } 129 | } -------------------------------------------------------------------------------- /SystemTrayAnimator/app.manifest: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 54 | 62 | 63 | 64 | 78 | 79 | 80 | --------------------------------------------------------------------------------