├── .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 |

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 | 
15 |
16 | Red Signal 10 FPS:
17 | 
18 |
19 | Timer 1 FPS:
20 | 
21 |
22 | Clock 1 FPS:
23 | 
24 |
25 | Umbrella 10 FPS:
26 | 
27 |
28 | ## Demo (Gif files)
29 |
30 | Rocket 20 FPS:
31 | 
32 |
33 | Car 20 FPS:
34 | 
35 |
36 | Walking 20 FPS:
37 | 
38 |
39 | Cup 20 FPS:
40 | 
41 |
42 | Phone 20 FPS:
43 | 
44 |
45 | Target 20 FPS:
46 | 
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 |
--------------------------------------------------------------------------------