Pārlūkot izejas kodu

Hotfix update v13.2

deadmoon 3 gadi atpakaļ
vecāks
revīzija
fb20110838

+ 6 - 0
CHANGELOG.md

@@ -1,3 +1,9 @@
+## [13.2] - 2022-05-08
+- New: Brave browser support in Cleaner (#176)
+- New: Find file lock handles and free it by killing the processes
+- Hotfix: Uninstalled UWP apps no longer remain in the list (#129)
+- Hotfix: 'Enable Compact Mode in Files' not reflecting current state
+
 ## [13.1] - 2022-05-07
 - New: Change DNS servers rapidly using Pinger (Cloudflare, OpenDNS, Quad9, Google, Alternate, Adguard, Cleanbrowsing) 
 - Hotfix: Rare issue with Cleaner not emptying subfolders

+ 1 - 1
Optimizer/ErrorLogger.cs

@@ -5,7 +5,7 @@ namespace Optimizer
 {
     internal static class ErrorLogger
     {
-        internal static string ErrorLogFile = Required.CoreFolder + "Optimizer.log";
+        internal static string ErrorLogFile = Path.Combine(Required.CoreFolder, "Optimizer.log");
 
         internal static void LogError(string functionName, string errorMessage, string errorStackTrace)
         {

+ 122 - 0
Optimizer/FileHandleHelper.cs

@@ -0,0 +1,122 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+namespace Optimizer
+{
+    public static class FileHandleHelper
+    {
+        public static List<Process> GetProcessesLockingFile(string path)
+        {
+            uint handle;
+            string key = Guid.NewGuid().ToString();
+            int res = RmStartSession(out handle, 0, key);
+
+            if (res != 0) return null;
+
+            try
+            {
+                const int MORE_DATA = 234;
+                uint pnProcInfoNeeded, pnProcInfo = 0, lpdwRebootReasons = RmRebootReasonNone;
+
+                string[] resources = { path };
+
+                res = RmRegisterResources(handle, (uint)resources.Length, resources, 0, null, 0, null);
+
+                if (res != 0) return null;
+
+                res = RmGetList(handle, out pnProcInfoNeeded, ref pnProcInfo, null, ref lpdwRebootReasons);
+
+                if (res == MORE_DATA)
+                {
+                    return EnumerateProcesses(pnProcInfoNeeded, handle, lpdwRebootReasons);
+                }
+                else if (res != 0) return null;
+            }
+            finally
+            {
+                RmEndSession(handle);
+            }
+
+            return new List<Process>();
+        }
+
+
+        [StructLayout(LayoutKind.Sequential)]
+        public struct RM_UNIQUE_PROCESS
+        {
+            public int dwProcessId;
+            public System.Runtime.InteropServices.ComTypes.FILETIME ProcessStartTime;
+        }
+
+        const int RmRebootReasonNone = 0;
+        const int CCH_RM_MAX_APP_NAME = 255;
+        const int CCH_RM_MAX_SVC_NAME = 63;
+
+        public enum RM_APP_TYPE
+        {
+            RmUnknownApp = 0,
+            RmMainWindow = 1,
+            RmOtherWindow = 2,
+            RmService = 3,
+            RmExplorer = 4,
+            RmConsole = 5,
+            RmCritical = 1000
+        }
+
+        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+        public struct RM_PROCESS_INFO
+        {
+            public RM_UNIQUE_PROCESS Process;
+
+            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCH_RM_MAX_APP_NAME + 1)] public string strAppName;
+
+            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = CCH_RM_MAX_SVC_NAME + 1)] public string strServiceShortName;
+
+            public RM_APP_TYPE ApplicationType;
+            public uint AppStatus;
+            public uint TSSessionId;
+            [MarshalAs(UnmanagedType.Bool)] public bool bRestartable;
+        }
+
+        [DllImport("rstrtmgr.dll", CharSet = CharSet.Unicode)]
+        static extern int RmRegisterResources(uint pSessionHandle, uint nFiles, string[] rgsFilenames,
+            uint nApplications, [In] RM_UNIQUE_PROCESS[] rgApplications, uint nServices,
+            string[] rgsServiceNames);
+
+        [DllImport("rstrtmgr.dll", CharSet = CharSet.Auto)]
+        static extern int RmStartSession(out uint pSessionHandle, int dwSessionFlags, string strSessionKey);
+
+        [DllImport("rstrtmgr.dll")]
+        static extern int RmEndSession(uint pSessionHandle);
+
+        [DllImport("rstrtmgr.dll")]
+        static extern int RmGetList(uint dwSessionHandle, out uint pnProcInfoNeeded,
+            ref uint pnProcInfo, [In, Out] RM_PROCESS_INFO[] rgAffectedApps,
+            ref uint lpdwRebootReasons);
+
+        private static List<Process> EnumerateProcesses(uint pnProcInfoNeeded, uint handle, uint lpdwRebootReasons)
+        {
+            var processes = new List<Process>(10);
+
+            var processInfo = new RM_PROCESS_INFO[pnProcInfoNeeded];
+            var pnProcInfo = pnProcInfoNeeded;
+
+            // Get the list
+            var res = RmGetList(handle, out pnProcInfoNeeded, ref pnProcInfo, processInfo, ref lpdwRebootReasons);
+
+            if (res != 0) return null;
+
+            for (int i = 0; i < pnProcInfo; i++)
+            {
+                try
+                {
+                    processes.Add(Process.GetProcessById(processInfo[i].Process.dwProcessId));
+                }
+                catch { }
+            }
+            return processes;
+        }
+    }
+}

+ 164 - 0
Optimizer/Forms/FileUnlockForm.Designer.cs

@@ -0,0 +1,164 @@
+namespace Optimizer
+{
+    partial class FileUnlockForm
+    {
+        /// <summary>
+        /// Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        /// Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        /// Required method for Designer support - do not modify
+        /// the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.txtFile = new System.Windows.Forms.TextBox();
+            this.radioFile = new System.Windows.Forms.Label();
+            this.btnFind = new System.Windows.Forms.Button();
+            this.panelModernAppsList = new System.Windows.Forms.Panel();
+            this.listProcesses = new Optimizer.MoonCheckList();
+            this.btnKill = new System.Windows.Forms.Button();
+            this.panelModernAppsList.SuspendLayout();
+            this.SuspendLayout();
+            // 
+            // txtFile
+            // 
+            this.txtFile.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
+            this.txtFile.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.txtFile.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.txtFile.ForeColor = System.Drawing.Color.White;
+            this.txtFile.Location = new System.Drawing.Point(16, 32);
+            this.txtFile.Margin = new System.Windows.Forms.Padding(2);
+            this.txtFile.Name = "txtFile";
+            this.txtFile.Size = new System.Drawing.Size(280, 25);
+            this.txtFile.TabIndex = 54;
+            // 
+            // radioFile
+            // 
+            this.radioFile.AutoSize = true;
+            this.radioFile.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.radioFile.ForeColor = System.Drawing.Color.DodgerBlue;
+            this.radioFile.Location = new System.Drawing.Point(11, 9);
+            this.radioFile.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
+            this.radioFile.Name = "radioFile";
+            this.radioFile.Size = new System.Drawing.Size(34, 19);
+            this.radioFile.TabIndex = 55;
+            this.radioFile.Tag = "themeable";
+            this.radioFile.Text = "File:";
+            // 
+            // btnFind
+            // 
+            this.btnFind.BackColor = System.Drawing.Color.DodgerBlue;
+            this.btnFind.FlatAppearance.BorderSize = 0;
+            this.btnFind.FlatAppearance.MouseDownBackColor = System.Drawing.Color.RoyalBlue;
+            this.btnFind.FlatAppearance.MouseOverBackColor = System.Drawing.Color.RoyalBlue;
+            this.btnFind.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+            this.btnFind.ForeColor = System.Drawing.Color.White;
+            this.btnFind.Location = new System.Drawing.Point(300, 32);
+            this.btnFind.Margin = new System.Windows.Forms.Padding(2);
+            this.btnFind.Name = "btnFind";
+            this.btnFind.Size = new System.Drawing.Size(103, 25);
+            this.btnFind.TabIndex = 58;
+            this.btnFind.Text = "Find";
+            this.btnFind.UseVisualStyleBackColor = false;
+            this.btnFind.Click += new System.EventHandler(this.btnFind_Click);
+            // 
+            // panelModernAppsList
+            // 
+            this.panelModernAppsList.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
+            | System.Windows.Forms.AnchorStyles.Left) 
+            | System.Windows.Forms.AnchorStyles.Right)));
+            this.panelModernAppsList.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.panelModernAppsList.Controls.Add(this.listProcesses);
+            this.panelModernAppsList.Location = new System.Drawing.Point(16, 74);
+            this.panelModernAppsList.Name = "panelModernAppsList";
+            this.panelModernAppsList.Size = new System.Drawing.Size(387, 292);
+            this.panelModernAppsList.TabIndex = 59;
+            // 
+            // listProcesses
+            // 
+            this.listProcesses.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
+            this.listProcesses.BorderStyle = System.Windows.Forms.BorderStyle.None;
+            this.listProcesses.CheckOnClick = true;
+            this.listProcesses.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.listProcesses.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.listProcesses.ForeColor = System.Drawing.Color.White;
+            this.listProcesses.FormattingEnabled = true;
+            this.listProcesses.HorizontalScrollbar = true;
+            this.listProcesses.Location = new System.Drawing.Point(0, 0);
+            this.listProcesses.Name = "listProcesses";
+            this.listProcesses.Size = new System.Drawing.Size(385, 290);
+            this.listProcesses.Sorted = true;
+            this.listProcesses.TabIndex = 0;
+            // 
+            // btnKill
+            // 
+            this.btnKill.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnKill.BackColor = System.Drawing.Color.DodgerBlue;
+            this.btnKill.FlatAppearance.BorderSize = 0;
+            this.btnKill.FlatAppearance.MouseDownBackColor = System.Drawing.Color.RoyalBlue;
+            this.btnKill.FlatAppearance.MouseOverBackColor = System.Drawing.Color.RoyalBlue;
+            this.btnKill.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+            this.btnKill.ForeColor = System.Drawing.Color.White;
+            this.btnKill.Location = new System.Drawing.Point(287, 371);
+            this.btnKill.Margin = new System.Windows.Forms.Padding(2);
+            this.btnKill.Name = "btnKill";
+            this.btnKill.Size = new System.Drawing.Size(116, 31);
+            this.btnKill.TabIndex = 61;
+            this.btnKill.Text = "Kill";
+            this.btnKill.UseVisualStyleBackColor = false;
+            this.btnKill.Click += new System.EventHandler(this.btnKill_Click);
+            // 
+            // FileUnlockForm
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
+            this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
+            this.ClientSize = new System.Drawing.Size(414, 413);
+            this.Controls.Add(this.btnKill);
+            this.Controls.Add(this.panelModernAppsList);
+            this.Controls.Add(this.btnFind);
+            this.Controls.Add(this.txtFile);
+            this.Controls.Add(this.radioFile);
+            this.DoubleBuffered = true;
+            this.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold);
+            this.ForeColor = System.Drawing.Color.White;
+            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;
+            this.MinimizeBox = false;
+            this.Name = "FileUnlockForm";
+            this.ShowIcon = false;
+            this.ShowInTaskbar = false;
+            this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
+            this.Load += new System.EventHandler(this.FileUnlockForm_Load);
+            this.panelModernAppsList.ResumeLayout(false);
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.TextBox txtFile;
+        private System.Windows.Forms.Label radioFile;
+        private System.Windows.Forms.Button btnFind;
+        private System.Windows.Forms.Panel panelModernAppsList;
+        private MoonCheckList listProcesses;
+        private System.Windows.Forms.Button btnKill;
+    }
+}

+ 64 - 0
Optimizer/Forms/FileUnlockForm.cs

@@ -0,0 +1,64 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+using System.Windows.Forms;
+
+namespace Optimizer
+{
+    public partial class FileUnlockForm : Form
+    {
+        List<Process> _lockingProcesses;
+
+        public FileUnlockForm()
+        {
+            InitializeComponent();
+            CheckForIllegalCrossThreadCalls = false;
+            Options.ApplyTheme(this);
+
+            radioFile.Text = Options.TranslationList["radioFile"].ToString();
+            btnFind.Text = Options.TranslationList["btnFind"].ToString();
+            btnKill.Text = Options.TranslationList["btnKill"].ToString();
+        }
+
+        private void FileUnlockForm_Load(object sender, EventArgs e)
+        {
+
+        }
+
+        private void btnFind_Click(object sender, EventArgs e)
+        {
+            if (string.IsNullOrEmpty(txtFile.Text)) return;
+            if (!File.Exists(txtFile.Text)) return;
+
+            _lockingProcesses = FileHandleHelper.GetProcessesLockingFile(txtFile.Text);
+
+            if (_lockingProcesses == null) return;
+
+            listProcesses.Items.Clear();
+            listProcesses.Items.AddRange(_lockingProcesses.Select(x => $"[{x.Id}] {x.ProcessName}").ToArray());
+        }
+
+        private void btnKill_Click(object sender, EventArgs e)
+        {
+            if (listProcesses.CheckedItems.Count <= 0) return;
+
+            foreach (string x in listProcesses.CheckedItems)
+            {
+                IEnumerable<Process> prs = Process.GetProcesses().Where(pr => pr.ProcessName == x.Replace(x.Substring(0, x.IndexOf("]") + 1), string.Empty).Trim());
+                foreach (Process z in prs)
+                {
+                    try
+                    {
+                        z.Kill();
+                    }
+                    catch { continue; }
+                }
+            }
+
+            btnFind.PerformClick();
+        }
+    }
+}

+ 120 - 0
Optimizer/Forms/FileUnlockForm.resx

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+  <!-- 
+    Microsoft ResX Schema 
+    
+    Version 2.0
+    
+    The primary goals of this format is to allow a simple XML format 
+    that is mostly human readable. The generation and parsing of the 
+    various data types are done through the TypeConverter classes 
+    associated with the data types.
+    
+    Example:
+    
+    ... ado.net/XML headers & schema ...
+    <resheader name="resmimetype">text/microsoft-resx</resheader>
+    <resheader name="version">2.0</resheader>
+    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+        <value>[base64 mime encoded serialized .NET Framework object]</value>
+    </data>
+    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+        <comment>This is a comment</comment>
+    </data>
+                
+    There are any number of "resheader" rows that contain simple 
+    name/value pairs.
+    
+    Each data row contains a name, and value. The row also contains a 
+    type or mimetype. Type corresponds to a .NET class that support 
+    text/value conversion through the TypeConverter architecture. 
+    Classes that don't support this are serialized and stored with the 
+    mimetype set.
+    
+    The mimetype is used for serialized objects, and tells the 
+    ResXResourceReader how to depersist the object. This is currently not 
+    extensible. For a given mimetype the value must be set accordingly:
+    
+    Note - application/x-microsoft.net.object.binary.base64 is the format 
+    that the ResXResourceWriter will generate, however the reader can 
+    read any of the formats listed below.
+    
+    mimetype: application/x-microsoft.net.object.binary.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+            : and then encoded with base64 encoding.
+    
+    mimetype: application/x-microsoft.net.object.soap.base64
+    value   : The object must be serialized with 
+            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+            : and then encoded with base64 encoding.
+
+    mimetype: application/x-microsoft.net.object.bytearray.base64
+    value   : The object must be serialized into a byte array 
+            : using a System.ComponentModel.TypeConverter
+            : and then encoded with base64 encoding.
+    -->
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 62 - 49
Optimizer/Forms/MainForm.Designer.cs

@@ -50,7 +50,7 @@ namespace Optimizer
             this.pictureBox1 = new System.Windows.Forms.PictureBox();
             this.label2 = new System.Windows.Forms.Label();
             this.bpanel = new System.Windows.Forms.Panel();
-            this.tabCollection = new Optimizer.MoonTabs();
+            this.tabCollection = new System.Windows.Forms.TabControl();
             this.universalTab = new System.Windows.Forms.TabPage();
             this.chromeTelemetrySw = new Optimizer.ToggleCard();
             this.ffTelemetrySw = new Optimizer.ToggleCard();
@@ -267,7 +267,7 @@ namespace Optimizer
             this.btnSaveHW = new System.Windows.Forms.Button();
             this.hwDetailed = new Optimizer.ToggleCard();
             this.integratorTab = new System.Windows.Forms.TabPage();
-            this.synapse = new Optimizer.MoonTabs();
+            this.synapse = new System.Windows.Forms.TabControl();
             this.integratorInfoTab = new System.Windows.Forms.TabPage();
             this.integrator7 = new System.Windows.Forms.Label();
             this.integrator6 = new System.Windows.Forms.Label();
@@ -386,6 +386,7 @@ namespace Optimizer
             this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
             this.trayOptions = new System.Windows.Forms.ToolStripMenuItem();
             this.trayRestartExplorer = new System.Windows.Forms.ToolStripMenuItem();
+            this.trayUnlocker = new System.Windows.Forms.ToolStripMenuItem();
             this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
             this.trayExit = new System.Windows.Forms.ToolStripMenuItem();
             this.launcherIcon = new System.Windows.Forms.NotifyIcon(this.components);
@@ -627,11 +628,11 @@ namespace Optimizer
             this.universalTab.Controls.Add(this.superfetchSw);
             this.universalTab.Controls.Add(this.faxSw);
             this.universalTab.Controls.Add(this.performanceSw);
-            this.universalTab.Location = new System.Drawing.Point(4, 25);
+            this.universalTab.Location = new System.Drawing.Point(4, 24);
             this.universalTab.Margin = new System.Windows.Forms.Padding(2);
             this.universalTab.Name = "universalTab";
             this.universalTab.Padding = new System.Windows.Forms.Padding(2);
-            this.universalTab.Size = new System.Drawing.Size(999, 610);
+            this.universalTab.Size = new System.Drawing.Size(999, 611);
             this.universalTab.TabIndex = 0;
             this.universalTab.Text = "Universal";
             // 
@@ -931,11 +932,11 @@ namespace Optimizer
             this.windows10Tab.Controls.Add(this.oldExplorerSw);
             this.windows10Tab.Controls.Add(this.adsSw);
             this.windows10Tab.Controls.Add(this.panelWin11Tweaks);
-            this.windows10Tab.Location = new System.Drawing.Point(4, 25);
+            this.windows10Tab.Location = new System.Drawing.Point(4, 24);
             this.windows10Tab.Margin = new System.Windows.Forms.Padding(2);
             this.windows10Tab.Name = "windows10Tab";
             this.windows10Tab.Padding = new System.Windows.Forms.Padding(2);
-            this.windows10Tab.Size = new System.Drawing.Size(999, 610);
+            this.windows10Tab.Size = new System.Drawing.Size(999, 611);
             this.windows10Tab.TabIndex = 1;
             this.windows10Tab.Text = "Windows 10";
             // 
@@ -1409,11 +1410,11 @@ namespace Optimizer
             // 
             this.windows8Tab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
             this.windows8Tab.Controls.Add(this.disableOneDriveSw);
-            this.windows8Tab.Location = new System.Drawing.Point(4, 25);
+            this.windows8Tab.Location = new System.Drawing.Point(4, 24);
             this.windows8Tab.Margin = new System.Windows.Forms.Padding(2);
             this.windows8Tab.Name = "windows8Tab";
             this.windows8Tab.Padding = new System.Windows.Forms.Padding(2);
-            this.windows8Tab.Size = new System.Drawing.Size(999, 610);
+            this.windows8Tab.Size = new System.Drawing.Size(999, 611);
             this.windows8Tab.TabIndex = 2;
             this.windows8Tab.Text = "Windows 8.1";
             // 
@@ -1441,10 +1442,10 @@ namespace Optimizer
             this.modernAppsTab.Controls.Add(this.refreshModernAppsButton);
             this.modernAppsTab.Controls.Add(this.txtModernAppsTitle);
             this.modernAppsTab.Controls.Add(this.panelModernAppsList);
-            this.modernAppsTab.Location = new System.Drawing.Point(4, 25);
+            this.modernAppsTab.Location = new System.Drawing.Point(4, 24);
             this.modernAppsTab.Name = "modernAppsTab";
             this.modernAppsTab.Padding = new System.Windows.Forms.Padding(3);
-            this.modernAppsTab.Size = new System.Drawing.Size(999, 610);
+            this.modernAppsTab.Size = new System.Drawing.Size(999, 611);
             this.modernAppsTab.TabIndex = 11;
             this.modernAppsTab.Text = "UWP Apps";
             // 
@@ -1565,10 +1566,10 @@ namespace Optimizer
             this.startupTab.Controls.Add(this.panel3);
             this.startupTab.Controls.Add(this.removeStartupItemB);
             this.startupTab.Controls.Add(this.startupTitle);
-            this.startupTab.Location = new System.Drawing.Point(4, 25);
+            this.startupTab.Location = new System.Drawing.Point(4, 24);
             this.startupTab.Margin = new System.Windows.Forms.Padding(2);
             this.startupTab.Name = "startupTab";
-            this.startupTab.Size = new System.Drawing.Size(999, 610);
+            this.startupTab.Size = new System.Drawing.Size(999, 611);
             this.startupTab.TabIndex = 7;
             this.startupTab.Text = "Startup";
             // 
@@ -1824,10 +1825,10 @@ namespace Optimizer
             this.appsTab.Controls.Add(this.panel10);
             this.appsTab.Controls.Add(this.panelCommonApps);
             this.appsTab.Controls.Add(this.groupSystemTools);
-            this.appsTab.Location = new System.Drawing.Point(4, 25);
+            this.appsTab.Location = new System.Drawing.Point(4, 24);
             this.appsTab.Name = "appsTab";
             this.appsTab.Padding = new System.Windows.Forms.Padding(3);
-            this.appsTab.Size = new System.Drawing.Size(999, 610);
+            this.appsTab.Size = new System.Drawing.Size(999, 611);
             this.appsTab.TabIndex = 12;
             this.appsTab.Text = "Apps";
             // 
@@ -1839,7 +1840,7 @@ namespace Optimizer
             this.txtFeedError.ForeColor = System.Drawing.Color.Gold;
             this.txtFeedError.Location = new System.Drawing.Point(3, 47);
             this.txtFeedError.Name = "txtFeedError";
-            this.txtFeedError.Size = new System.Drawing.Size(993, 440);
+            this.txtFeedError.Size = new System.Drawing.Size(993, 441);
             this.txtFeedError.TabIndex = 171;
             this.txtFeedError.Text = "No internet connection, try refreshing links again";
             this.txtFeedError.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
@@ -1892,7 +1893,7 @@ namespace Optimizer
             this.groupSoundVideo.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
             this.groupSoundVideo.Location = new System.Drawing.Point(749, 64);
             this.groupSoundVideo.Name = "groupSoundVideo";
-            this.groupSoundVideo.Size = new System.Drawing.Size(227, 591);
+            this.groupSoundVideo.Size = new System.Drawing.Size(227, 418);
             this.groupSoundVideo.TabIndex = 166;
             // 
             // lblInternet
@@ -1916,7 +1917,7 @@ namespace Optimizer
             this.groupCoding.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
             this.groupCoding.Location = new System.Drawing.Point(517, 64);
             this.groupCoding.Name = "groupCoding";
-            this.groupCoding.Size = new System.Drawing.Size(226, 591);
+            this.groupCoding.Size = new System.Drawing.Size(226, 418);
             this.groupCoding.TabIndex = 165;
             // 
             // groupInternet
@@ -1927,7 +1928,7 @@ namespace Optimizer
             this.groupInternet.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
             this.groupInternet.Location = new System.Drawing.Point(265, 64);
             this.groupInternet.Name = "groupInternet";
-            this.groupInternet.Size = new System.Drawing.Size(246, 591);
+            this.groupInternet.Size = new System.Drawing.Size(246, 418);
             this.groupInternet.TabIndex = 164;
             // 
             // panel10
@@ -1986,7 +1987,7 @@ namespace Optimizer
             this.panelCommonApps.Controls.Add(this.bitPref);
             this.panelCommonApps.Controls.Add(this.goToDownloadsB);
             this.panelCommonApps.Dock = System.Windows.Forms.DockStyle.Bottom;
-            this.panelCommonApps.Location = new System.Drawing.Point(3, 487);
+            this.panelCommonApps.Location = new System.Drawing.Point(3, 488);
             this.panelCommonApps.Name = "panelCommonApps";
             this.panelCommonApps.Size = new System.Drawing.Size(993, 120);
             this.panelCommonApps.TabIndex = 162;
@@ -2169,7 +2170,7 @@ namespace Optimizer
             this.groupSystemTools.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
             this.groupSystemTools.Location = new System.Drawing.Point(13, 64);
             this.groupSystemTools.Name = "groupSystemTools";
-            this.groupSystemTools.Size = new System.Drawing.Size(246, 591);
+            this.groupSystemTools.Size = new System.Drawing.Size(246, 418);
             this.groupSystemTools.TabIndex = 162;
             // 
             // cleanerTab
@@ -2178,11 +2179,11 @@ namespace Optimizer
             this.cleanerTab.Controls.Add(this.panel14);
             this.cleanerTab.Controls.Add(this.panel13);
             this.cleanerTab.Controls.Add(this.panel1);
-            this.cleanerTab.Location = new System.Drawing.Point(4, 25);
+            this.cleanerTab.Location = new System.Drawing.Point(4, 24);
             this.cleanerTab.Margin = new System.Windows.Forms.Padding(2);
             this.cleanerTab.Name = "cleanerTab";
             this.cleanerTab.Padding = new System.Windows.Forms.Padding(2);
-            this.cleanerTab.Size = new System.Drawing.Size(999, 610);
+            this.cleanerTab.Size = new System.Drawing.Size(999, 611);
             this.cleanerTab.TabIndex = 5;
             this.cleanerTab.Text = "Cleaner";
             // 
@@ -2193,7 +2194,7 @@ namespace Optimizer
             this.panel14.Dock = System.Windows.Forms.DockStyle.Fill;
             this.panel14.Location = new System.Drawing.Point(221, 2);
             this.panel14.Name = "panel14";
-            this.panel14.Size = new System.Drawing.Size(776, 545);
+            this.panel14.Size = new System.Drawing.Size(776, 546);
             this.panel14.TabIndex = 51;
             // 
             // listCleanPreview
@@ -2207,7 +2208,7 @@ namespace Optimizer
             this.listCleanPreview.HorizontalScrollbar = true;
             this.listCleanPreview.Location = new System.Drawing.Point(0, 0);
             this.listCleanPreview.Name = "listCleanPreview";
-            this.listCleanPreview.Size = new System.Drawing.Size(774, 543);
+            this.listCleanPreview.Size = new System.Drawing.Size(774, 544);
             this.listCleanPreview.TabIndex = 1;
             // 
             // panel13
@@ -2219,7 +2220,7 @@ namespace Optimizer
             this.panel13.Controls.Add(this.cleanDriveB);
             this.panel13.Controls.Add(this.lblFootprint);
             this.panel13.Dock = System.Windows.Forms.DockStyle.Bottom;
-            this.panel13.Location = new System.Drawing.Point(221, 547);
+            this.panel13.Location = new System.Drawing.Point(221, 548);
             this.panel13.Name = "panel13";
             this.panel13.Size = new System.Drawing.Size(776, 61);
             this.panel13.TabIndex = 50;
@@ -2349,7 +2350,7 @@ namespace Optimizer
             this.panel1.Location = new System.Drawing.Point(2, 2);
             this.panel1.Margin = new System.Windows.Forms.Padding(2);
             this.panel1.Name = "panel1";
-            this.panel1.Size = new System.Drawing.Size(219, 606);
+            this.panel1.Size = new System.Drawing.Size(219, 607);
             this.panel1.TabIndex = 47;
             // 
             // bravePasswords
@@ -2799,10 +2800,10 @@ namespace Optimizer
             this.pingerTab.Controls.Add(this.pingerTitle);
             this.pingerTab.Controls.Add(this.boxAdapter);
             this.pingerTab.Controls.Add(this.boxDNS);
-            this.pingerTab.Location = new System.Drawing.Point(4, 25);
+            this.pingerTab.Location = new System.Drawing.Point(4, 24);
             this.pingerTab.Name = "pingerTab";
             this.pingerTab.Padding = new System.Windows.Forms.Padding(3);
-            this.pingerTab.Size = new System.Drawing.Size(999, 610);
+            this.pingerTab.Size = new System.Drawing.Size(999, 611);
             this.pingerTab.TabIndex = 13;
             this.pingerTab.Text = "Pinger";
             // 
@@ -3134,11 +3135,11 @@ namespace Optimizer
             this.hostsEditorTab.Controls.Add(this.panel4);
             this.hostsEditorTab.Controls.Add(this.hostsTitle);
             this.hostsEditorTab.Controls.Add(this.linkLocate);
-            this.hostsEditorTab.Location = new System.Drawing.Point(4, 25);
+            this.hostsEditorTab.Location = new System.Drawing.Point(4, 24);
             this.hostsEditorTab.Margin = new System.Windows.Forms.Padding(2);
             this.hostsEditorTab.Name = "hostsEditorTab";
             this.hostsEditorTab.Padding = new System.Windows.Forms.Padding(2);
-            this.hostsEditorTab.Size = new System.Drawing.Size(999, 610);
+            this.hostsEditorTab.Size = new System.Drawing.Size(999, 611);
             this.hostsEditorTab.TabIndex = 9;
             this.hostsEditorTab.Text = "Hosts";
             // 
@@ -3430,11 +3431,11 @@ namespace Optimizer
             this.registryFixerTab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
             this.registryFixerTab.Controls.Add(this.panel2);
             this.registryFixerTab.Controls.Add(this.registryTitle);
-            this.registryFixerTab.Location = new System.Drawing.Point(4, 25);
+            this.registryFixerTab.Location = new System.Drawing.Point(4, 24);
             this.registryFixerTab.Margin = new System.Windows.Forms.Padding(2);
             this.registryFixerTab.Name = "registryFixerTab";
             this.registryFixerTab.Padding = new System.Windows.Forms.Padding(2);
-            this.registryFixerTab.Size = new System.Drawing.Size(999, 610);
+            this.registryFixerTab.Size = new System.Drawing.Size(999, 611);
             this.registryFixerTab.TabIndex = 8;
             this.registryFixerTab.Text = "Registry";
             // 
@@ -3640,10 +3641,10 @@ namespace Optimizer
             this.indiciumTab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
             this.indiciumTab.Controls.Add(this.panel12);
             this.indiciumTab.Controls.Add(this.panel11);
-            this.indiciumTab.Location = new System.Drawing.Point(4, 25);
+            this.indiciumTab.Location = new System.Drawing.Point(4, 24);
             this.indiciumTab.Name = "indiciumTab";
             this.indiciumTab.Padding = new System.Windows.Forms.Padding(3);
-            this.indiciumTab.Size = new System.Drawing.Size(999, 610);
+            this.indiciumTab.Size = new System.Drawing.Size(999, 611);
             this.indiciumTab.TabIndex = 14;
             this.indiciumTab.Text = "Hardware";
             // 
@@ -3654,7 +3655,7 @@ namespace Optimizer
             this.panel12.Dock = System.Windows.Forms.DockStyle.Fill;
             this.panel12.Location = new System.Drawing.Point(3, 38);
             this.panel12.Name = "panel12";
-            this.panel12.Size = new System.Drawing.Size(993, 569);
+            this.panel12.Size = new System.Drawing.Size(993, 570);
             this.panel12.TabIndex = 2;
             // 
             // specsTree
@@ -3709,7 +3710,7 @@ namespace Optimizer
             treeNode6,
             treeNode7,
             treeNode8});
-            this.specsTree.Size = new System.Drawing.Size(991, 567);
+            this.specsTree.Size = new System.Drawing.Size(991, 568);
             this.specsTree.TabIndex = 0;
             this.specsTree.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.specsTree_NodeMouseClick);
             // 
@@ -3827,11 +3828,11 @@ namespace Optimizer
             // 
             this.integratorTab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
             this.integratorTab.Controls.Add(this.synapse);
-            this.integratorTab.Location = new System.Drawing.Point(4, 25);
+            this.integratorTab.Location = new System.Drawing.Point(4, 24);
             this.integratorTab.Margin = new System.Windows.Forms.Padding(2);
             this.integratorTab.Name = "integratorTab";
             this.integratorTab.Padding = new System.Windows.Forms.Padding(2);
-            this.integratorTab.Size = new System.Drawing.Size(999, 610);
+            this.integratorTab.Size = new System.Drawing.Size(999, 611);
             this.integratorTab.TabIndex = 10;
             this.integratorTab.Text = "Integrator";
             // 
@@ -3850,7 +3851,7 @@ namespace Optimizer
             this.synapse.Name = "synapse";
             this.synapse.Padding = new System.Drawing.Point(0, 0);
             this.synapse.SelectedIndex = 0;
-            this.synapse.Size = new System.Drawing.Size(995, 606);
+            this.synapse.Size = new System.Drawing.Size(995, 607);
             this.synapse.TabIndex = 0;
             // 
             // integratorInfoTab
@@ -3867,7 +3868,7 @@ namespace Optimizer
             this.integratorInfoTab.Margin = new System.Windows.Forms.Padding(2);
             this.integratorInfoTab.Name = "integratorInfoTab";
             this.integratorInfoTab.Padding = new System.Windows.Forms.Padding(2);
-            this.integratorInfoTab.Size = new System.Drawing.Size(987, 577);
+            this.integratorInfoTab.Size = new System.Drawing.Size(987, 579);
             this.integratorInfoTab.TabIndex = 0;
             this.integratorInfoTab.Text = "Info";
             // 
@@ -3975,7 +3976,7 @@ namespace Optimizer
             this.tabPage8.Margin = new System.Windows.Forms.Padding(2);
             this.tabPage8.Name = "tabPage8";
             this.tabPage8.Padding = new System.Windows.Forms.Padding(2);
-            this.tabPage8.Size = new System.Drawing.Size(987, 577);
+            this.tabPage8.Size = new System.Drawing.Size(987, 579);
             this.tabPage8.TabIndex = 1;
             this.tabPage8.Text = "Add/Modify";
             // 
@@ -4319,7 +4320,7 @@ namespace Optimizer
             this.tabPage9.Margin = new System.Windows.Forms.Padding(2);
             this.tabPage9.Name = "tabPage9";
             this.tabPage9.Padding = new System.Windows.Forms.Padding(2);
-            this.tabPage9.Size = new System.Drawing.Size(987, 577);
+            this.tabPage9.Size = new System.Drawing.Size(987, 579);
             this.tabPage9.TabIndex = 2;
             this.tabPage9.Text = "Remove";
             // 
@@ -4429,7 +4430,7 @@ namespace Optimizer
             this.tabPage10.Margin = new System.Windows.Forms.Padding(2);
             this.tabPage10.Name = "tabPage10";
             this.tabPage10.Padding = new System.Windows.Forms.Padding(2);
-            this.tabPage10.Size = new System.Drawing.Size(987, 577);
+            this.tabPage10.Size = new System.Drawing.Size(987, 579);
             this.tabPage10.TabIndex = 3;
             this.tabPage10.Text = "Ready Menus";
             // 
@@ -4569,7 +4570,7 @@ namespace Optimizer
             this.tabPage11.Margin = new System.Windows.Forms.Padding(2);
             this.tabPage11.Name = "tabPage11";
             this.tabPage11.Padding = new System.Windows.Forms.Padding(2);
-            this.tabPage11.Size = new System.Drawing.Size(987, 577);
+            this.tabPage11.Size = new System.Drawing.Size(987, 579);
             this.tabPage11.TabIndex = 4;
             this.tabPage11.Text = "Run Dialog";
             // 
@@ -4769,11 +4770,11 @@ namespace Optimizer
             this.optionsTab.Controls.Add(this.lblTheming);
             this.optionsTab.Controls.Add(this.quickAccessToggle);
             this.optionsTab.Controls.Add(this.helpTipsToggle);
-            this.optionsTab.Location = new System.Drawing.Point(4, 25);
+            this.optionsTab.Location = new System.Drawing.Point(4, 24);
             this.optionsTab.Margin = new System.Windows.Forms.Padding(2);
             this.optionsTab.Name = "optionsTab";
             this.optionsTab.Padding = new System.Windows.Forms.Padding(2);
-            this.optionsTab.Size = new System.Drawing.Size(999, 610);
+            this.optionsTab.Size = new System.Drawing.Size(999, 611);
             this.optionsTab.TabIndex = 6;
             this.optionsTab.Text = "Options";
             // 
@@ -5323,11 +5324,12 @@ namespace Optimizer
             this.toolStripSeparator1,
             this.trayOptions,
             this.trayRestartExplorer,
+            this.trayUnlocker,
             this.toolStripSeparator2,
             this.trayExit});
             this.launcherMenu.Name = "launcherMenu";
             this.launcherMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
-            this.launcherMenu.Size = new System.Drawing.Size(221, 334);
+            this.launcherMenu.Size = new System.Drawing.Size(221, 360);
             // 
             // trayDownSpeed
             // 
@@ -5461,6 +5463,16 @@ namespace Optimizer
             this.trayRestartExplorer.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
             this.trayRestartExplorer.Click += new System.EventHandler(this.restartExpolorerItem_Click);
             // 
+            // trayUnlocker
+            // 
+            this.trayUnlocker.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold);
+            this.trayUnlocker.ForeColor = System.Drawing.Color.White;
+            this.trayUnlocker.Image = ((System.Drawing.Image)(resources.GetObject("trayUnlocker.Image")));
+            this.trayUnlocker.Name = "trayUnlocker";
+            this.trayUnlocker.Size = new System.Drawing.Size(220, 26);
+            this.trayUnlocker.Text = "Find Handles";
+            this.trayUnlocker.Click += new System.EventHandler(this.trayUnlocker_Click);
+            // 
             // toolStripSeparator2
             // 
             this.toolStripSeparator2.Name = "toolStripSeparator2";
@@ -5618,7 +5630,7 @@ namespace Optimizer
         private System.Windows.Forms.PictureBox pictureBox1;
         private System.Windows.Forms.Label label2;
         private System.Windows.Forms.Panel bpanel;
-        private Optimizer.MoonTabs tabCollection;
+        private System.Windows.Forms.TabControl tabCollection;
         private System.Windows.Forms.TabPage universalTab;
         private System.Windows.Forms.TabPage windows10Tab;
         private System.Windows.Forms.TabPage windows8Tab;
@@ -5664,7 +5676,7 @@ namespace Optimizer
         private System.Windows.Forms.Button addHostB;
         private System.Windows.Forms.TextBox txtIP;
         private System.Windows.Forms.TabPage integratorTab;
-        private Optimizer.MoonTabs synapse;
+        private System.Windows.Forms.TabControl synapse;
         private System.Windows.Forms.TabPage integratorInfoTab;
         private System.Windows.Forms.TabPage tabPage8;
         private System.Windows.Forms.TabPage tabPage9;
@@ -5961,6 +5973,7 @@ namespace Optimizer
         private MoonCheck braveHistory;
         private MoonCheck braveCookies;
         private MoonCheck braveCache;
+        private ToolStripMenuItem trayUnlocker;
     }
 }
 

+ 7 - 0
Optimizer/Forms/MainForm.cs

@@ -1760,6 +1760,7 @@ namespace Optimizer
                 trayPinger.Text = translationList["trayPinger"];
                 trayHosts.Text = translationList["trayHosts"];
                 trayAD.Text = translationList["trayAD"];
+                trayUnlocker.Text = translationList["trayUnlocker"];
                 trayOptions.Text = translationList["trayOptions"];
                 trayRegistry.Text = translationList["trayRegistry"];
                 trayRestartExplorer.Text = translationList["trayRestartExplorer"];
@@ -4455,5 +4456,11 @@ namespace Optimizer
 
             GetDesktopItems();
         }
+
+        private void trayUnlocker_Click(object sender, EventArgs e)
+        {
+            FileUnlockForm fuf = new FileUnlockForm();
+            fuf.ShowDialog(this);
+        }
     }
 }

+ 13 - 2
Optimizer/Forms/MainForm.resx

@@ -146,7 +146,7 @@
   <data name="pictureBox4.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
-        DgAACw4BQL7hQQAABDBJREFUOE91lGtMXFUQx4fXFmXbhd0FFop9hJZCa60Rqs0ij1rosrDsloVS66NG
+        DAAACwwBP0AiyAAABDBJREFUOE91lGtMXFUQx4fXFmXbhd0FFop9hJZCa60Rqs0ij1rosrDsloVS66NG
         A5s2tiSlKtpCKIlt+AC2qYCABLQklMT4+KCx9oux0SbWGBONVBNjQlHbgkUM2H3cc+/fuWcvlar9J7M7
         d86c351z5pxL/6fijRbybbNT6SYLrbSapGXZonbQlUGnAusoUJZuZN9NMUTPFWZS31MbaOZ0Ic0PlNBs
         TxFNdTtp6rVH+b+QprqctNBfTJGRUh4rlrn7S7IMgKGEuBidRXsfchAGygmDZYTeEtJ6tgL9hcCAE+jN
@@ -739,7 +739,7 @@ any application only by typing your desired keyword.</value>
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC0
-        GgAAAk1TRnQBSQFMAgEBCQEAAUgBBwFIAQcBIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA
+        GgAAAk1TRnQBSQFMAgEBCQEAAWABBwFgAQcBIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA
         AwABYAMAAQEBAAEgBgABwP8A/wD/AP8A/wD/AP8A/wAeAANHAYB0//8AiQADRwGAdP//AIkAAyoBQANH
         AYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANH
         AYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGA/wD/AP8A
@@ -1075,6 +1075,17 @@ any application only by typing your desired keyword.</value>
         xbTbVt3o8lXjfz/wSULjWdgSIqmwdw7hrGFhS4ikEn6HFVhCJI2UN1iJJUTCsO5DOM/BilrBlgZ74xIs
         c7AiJthvwzpbwTYPK/OE2DCsoxVs92GF/TdPZ0kD81hCJIZV2n/PFp6Jo4r7e1SozWPmgd47KsTX5VFj
         a9i2P941dR7atLRpAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <data name="trayUnlocker.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
+        DwAACw8BkvkDpQAAARhJREFUaEPtjwEOgzAMA/n/q/jZJqYEGSsrtLTFm3JSpBKn5LokSZJ8WNf15WWt
+        3wIf8JMPiR6wlcX6RPJbWawPS+cDZvO3D8CeNCyL39iXhUXxG/uysOi3sywuGUnjWRaXjKTxLItLRtJ4
+        lsUlI2nMvCcHC0ZnrK0vBctFojwjBctFojwjBctFojwjBctFojwjA4q5HJ4dnOHsMWqlaueH0irTeq87
+        dyTu3O1CD4Ee/2imx/Ie/2jmbDHKXZmzz3mUFnvGZfGBUjaUK1JcFh8oZUOpkaqZnYYvjpZjhmXxTikb
+        Tmk5ZlgW75SyKZQEMDvLrTUflKgRab03hFqZ2vkpsFQkdmXmUSLBUtk1PSJZLBtLkiTZWJY3wD7ERWkV
+        gHcAAAAASUVORK5CYII=
 </value>
   </data>
   <data name="trayExit.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

+ 1 - 0
Optimizer/Forms/UpdateForm.Designer.cs

@@ -144,6 +144,7 @@ namespace Optimizer
             this.Controls.Add(this.btnNo);
             this.Controls.Add(this.btnOK);
             this.Controls.Add(this.txtMessage);
+            this.DoubleBuffered = true;
             this.Font = new System.Drawing.Font("Segoe UI Semibold", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
             this.ForeColor = System.Drawing.Color.White;
             this.MinimizeBox = false;

+ 1 - 0
Optimizer/Forms/UpdateForm.cs

@@ -9,6 +9,7 @@ namespace Optimizer
         public UpdateForm(string message, bool newUpdate, string changelog, string latestVersion)
         {
             InitializeComponent();
+            CheckForIllegalCrossThreadCalls = false;
             Options.ApplyTheme(this);
 
             txtMessage.Text = message;

+ 10 - 0
Optimizer/Optimizer.csproj

@@ -111,6 +111,7 @@
     <Compile Include="Controls\ToggleCard.Designer.cs">
       <DependentUpon>ToggleCard.cs</DependentUpon>
     </Compile>
+    <Compile Include="FileHandleHelper.cs" />
     <Compile Include="Forms\AboutForm.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -144,6 +145,12 @@
     </Compile>
     <Compile Include="EmbeddedAssembly.cs" />
     <Compile Include="Enums.cs" />
+    <Compile Include="Forms\FileUnlockForm.cs">
+      <SubType>Form</SubType>
+    </Compile>
+    <Compile Include="Forms\FileUnlockForm.Designer.cs">
+      <DependentUpon>FileUnlockForm.cs</DependentUpon>
+    </Compile>
     <Compile Include="Forms\FirstRunForm.cs">
       <SubType>Form</SubType>
     </Compile>
@@ -234,6 +241,9 @@
     <EmbeddedResource Include="Controls\AppCard.resx">
       <DependentUpon>AppCard.cs</DependentUpon>
     </EmbeddedResource>
+    <EmbeddedResource Include="Forms\FileUnlockForm.resx">
+      <DependentUpon>FileUnlockForm.cs</DependentUpon>
+    </EmbeddedResource>
     <EmbeddedResource Include="Forms\FirstRunForm.resx">
       <DependentUpon>FirstRunForm.cs</DependentUpon>
     </EmbeddedResource>

+ 1 - 1
Optimizer/Program.cs

@@ -13,7 +13,7 @@ namespace Optimizer
         /* DO NOT LEAVE THEM EMPTY */
 
         internal readonly static float Major = 13;
-        internal readonly static float Minor = 1;
+        internal readonly static float Minor = 2;
 
         internal readonly static bool EXPERIMENTAL_BUILD = false;
 

+ 3 - 0
Optimizer/Resources/i18n/AR.json

@@ -4,6 +4,9 @@
 	"restartButton8": "إعادة التشغيل الآن",
 	"restartButton10": "إعادة التشغيل الآن",
 	"restartAndApply": "إعادة التشغيل لتطبيق التغييرات؟",
+	"btnFind": "يجد",
+	"btnKill": "قتل",
+	"trayUnlocker": "مقابض الملفات",
 	"onedriveM": "هل أنت متأكد من أنك تريد إزالة تثبيت OneDrive؟ يؤدي هذا إلى حذف ملفات سطح المكتب والمستندات الخاصة بك! استخدم هذا الخيار فقط في حساب محلي!",
 	"systemRestoreM": "هل أنت متأكد أنك تريد تعطيل استعادة النظام؟ سيؤدي هذا إلى حذف صورك الاحتياطية الحالية!",
 	"txtVersion": "الإصدار: {VN}",

+ 3 - 0
Optimizer/Resources/i18n/CN.json

@@ -4,6 +4,9 @@
 	"restartButton8": "现在重启",
 	"restartButton10": "现在重启",
 	"restartAndApply": "重新启动以应用更改?",
+	"btnFind": "寻找",
+	"btnKill": "杀",
+	"trayUnlocker": "文件句柄",
 	"txtVersion": "版本: {VN}",
 	"txtBitness": "您使用的是{BITS}",
 	"onedriveM": "确定要卸载 OneDrive 吗? 这将删除您的桌面和文档文件! 仅在本地帐户上使用此选项!",

+ 3 - 0
Optimizer/Resources/i18n/CZ.json

@@ -4,6 +4,9 @@
 	"restartButton8": "Restartovat nyní",
 	"restartButton10": "Restartovat nyní",
 	"restartAndApply": "Restartovat a použít změny?",
+	"btnFind": "Nalézt",
+	"btnKill": "Zabít",
+	"trayUnlocker": "Držadla souborů",
 	"txtVersion": "Verze: {VN}",
 	"onedriveM": "Opravdu chcete odinstalovat OneDrive? Tím smažete soubory plochy a dokumentů! Tuto možnost používejte pouze na místním účtu!",
 	"systemRestoreM": "Opravdu chcete zakázat Obnovení systému? Tím se odstraní vaše aktuální záložní obrázky!",

+ 3 - 0
Optimizer/Resources/i18n/DE.json

@@ -5,6 +5,9 @@
 	"restartButton10": "Jetzt neu starten",
 	"restartAndApply": "Neu starten, um Änderungen anzuwenden?",
 	"txtVersion": "Version: {VN}",
+	"btnFind": "Finden",
+	"btnKill": "Töten",
+	"trayUnlocker": "Dateihandles",
 	"txtBitness": "Betriebssystem: {BITS}",
 	"onedriveM": "Möchten Sie OneDrive wirklich deinstallieren? Dadurch werden Ihre Desktop und Dokumentdateien gelöscht! Verwenden Sie diese Option nur auf einem lokalen konto!",
 	"linkUpdate": "Update verfügbar",

+ 3 - 0
Optimizer/Resources/i18n/EL.json

@@ -3,6 +3,9 @@
 	"restartButton": "Επανεκκίνηση τώρα",
 	"restartButton8": "Επανεκκίνηση τώρα",
 	"restartButton10": "Επανεκκίνηση τώρα",
+	"btnFind": "Εύρεση",
+	"btnKill": "Τερματισμός",
+	"trayUnlocker": "File Handles",
 	"restartAndApply": "Επανεκκίνηση για την εφαρμογή των αλλαγών;",
 	"txtVersion": "Έκδοση: {VN}",
 	"txtBitness": "Αρχιτεκτονική {BITS}",

+ 3 - 0
Optimizer/Resources/i18n/EN.json

@@ -3,6 +3,9 @@
 	"restartButton": "Restart now",
 	"restartButton8": "Restart now",
 	"restartButton10": "Restart now",
+	"btnFind": "Find",
+	"btnKill": "Kill",
+	"trayUnlocker": "File Handles",
 	"restartAndApply": "Restart to apply changes?",
 	"txtVersion": "Version: {VN}",
 	"txtBitness": "You are working with {BITS}",

+ 3 - 0
Optimizer/Resources/i18n/ES.json

@@ -3,6 +3,9 @@
 	"restartButton": "Reiniciar ahora",
 	"restartButton8": "Reiniciar ahora",
 	"restartButton10": "Reiniciar ahora",
+	"btnFind": "Encontrar",
+	"btnKill": "Matar",
+	"trayUnlocker": "Asas de archivo",
 	"restartAndApply": "Reiniciar para aplicar cambios?",
 	"onedriveM": "¿Seguro que quieres desinstalar OneDrive? ¡Esto eliminará sus archivos de escritorio y documentos! ¡Use esta opción solo en una cuenta local!",
 	"txtVersion": "Versión: {VN}",

+ 3 - 0
Optimizer/Resources/i18n/FR.json

@@ -3,6 +3,9 @@
 	"restartButton": "redemarrer maintenant",
 	"restartButton8": "redemarrer maintenant",
 	"restartButton10": "redemarrer maintenant",
+	"btnFind": "Trouver",
+	"btnKill": "Tuer",
+	"trayUnlocker": "Poignées de fichier",
 	"restartAndApply": "Redemarrer pour appliquer les changements?",
 	"onedriveM": "Voulez-vous vraiment désinstaller OneDrive? Cela supprimera vos fichiers de bureau et de document! N'utilisez cette option que sur un compte local!",
 	"txtVersion": "Version: {VN}",

+ 3 - 0
Optimizer/Resources/i18n/IT.json

@@ -5,6 +5,9 @@
 	"restartButton10": "riavvia ora",
 	"restartAndApply": "Riavviare per applicare le modifiche?",
 	"txtVersion": "Versione: {VN}",
+	"btnFind": "Trova",
+	"btnKill": "Uccisione",
+	"trayUnlocker": "Manici di file",
 	"txtBitness": "Architettura: {BITS}",
 	"linkUpdate": "Aggiornamento disponibile",
 	"lblLab": "Build sperimentale\n(cancellare dopo il test)",

+ 3 - 0
Optimizer/Resources/i18n/KO.json

@@ -3,6 +3,9 @@
 	"restartButton": "지금 다시 시작",
 	"restartButton8": "지금 다시 시작",
 	"restartButton10": "지금 다시 시작",
+	"btnFind": "찾다",
+	"btnKill": "죽임",
+	"trayUnlocker": "파일 핸들",
 	"restartAndApply": "변경을 적용하려면 다시 시작하시겠습니까?",
 	"onedriveM": "OneDrive를 제거하시겠습니까? 데스크탑 및 문서 파일이 삭제됩니다! 로컬 계정에서만 이 옵션을 사용하십시오!",
 	"systemRestoreM": "시스템 복원을 비활성화하시겠습니까? 현재 백업 이미지가 삭제됩니다!",

+ 3 - 0
Optimizer/Resources/i18n/PL.json

@@ -3,6 +3,9 @@
 	"restartButton": "Uruchom ponownie teraz",
 	"restartButton8": "Uruchom ponownie teraz",
 	"restartButton10": "Uruchom ponownie teraz",
+	"btnFind": "Znajdować",
+	"btnKill": "Zabić",
+	"trayUnlocker": "Uchwyty do plików",
 	"restartAndApply": "Uruchom ponownie, aby zastosować zmiany?",
 	"onedriveM": "Czy na pewno chcesz odinstalować OneDrive? Spowoduje to usunięcie plików pulpitu i dokumentów! Używaj tej opcji tylko na koncie lokalnym!",
 	"txtVersion": "Wersja: {VN}",

+ 3 - 0
Optimizer/Resources/i18n/PT.json

@@ -3,6 +3,9 @@
 	"restartButton": "reinicie agora",
 	"restartButton8": "reinicie agora",
 	"restartButton10": "reinicie agora",
+	"btnFind": "Encontrar",
+	"btnKill": "Matar",
+	"trayUnlocker": "Alças de arquivo",
 	"restartAndApply": "Reiniciar para aplicar as alterações?",
 	"onedriveM": "Tem certeza de que deseja desinstalar o OneDrive? Isso excluirá seus arquivos da área de trabalho e de documentos! Use esta opção apenas em uma conta local!",
 	"CleanPreviewForm": "Antevisão Limpa",

+ 3 - 0
Optimizer/Resources/i18n/RU.json

@@ -5,6 +5,9 @@
 	"restartButton10": "Перезапустить сейчас",
 	"restartAndApply": "Перезапустить, чтобы применить изменения?",
 	"txtVersion": "Версия: {VN}",
+	"btnFind": "Находить",
+	"btnKill": "Убийство",
+	"trayUnlocker": "Дескрипторы файлов",
 	"txtBitness": "Вы работаете с {BITS}",
 	"systemRestoreM": "Вы уверены, что хотите отключить восстановление системы? Это удалит ваши текущие резервные изображения!",
 	"onedriveM": "Вы уверены, что хотите удалить OneDrive? Это удалит файлы рабочего стола и документов! Используйте эту опцию только для локальной учетной записи!",

+ 3 - 0
Optimizer/Resources/i18n/TR.json

@@ -7,6 +7,9 @@
 	"onedriveM": "OneDrive'ı kaldırmak istediğinizden emin misiniz? Bu, Masaüstü ve Belge dosyalarınızı siler! Bu seçeneği yalnızca yerel bir hesapta kullanın!",
 	"txtVersion": "Versiyon: {VN}",
 	"txtBitness": "{BITS} ile çalışıyor.",
+	"btnFind": "Bulmak",
+	"btnKill": "Öldürmek",
+	"trayUnlocker": "Dosya Tutamaçları",
 	"CleanPreviewForm": "Temiz Önizleme",
 	"systemRestoreM": "Sistem Geri Yükleme'yi devre dışı bırakmak istediğinizden emin misiniz? Bu, mevcut yedek resimlerinizi siler!",
 	"linkUpdate": "Güncelleme Mevcut",

+ 3 - 0
Optimizer/Resources/i18n/TW.json

@@ -8,6 +8,9 @@
 	"txtVersion": "版本: {VN}",
 	"systemRestoreM": "您確定要禁用系統還原嗎? 這將刪除您當前的備份圖像!",
 	"txtBitness": "您使用的是{BITS}",
+	"btnFind": "尋找",
+	"btnKill": "殺",
+	"trayUnlocker": "文件句柄",
 	"linkUpdate": "更新可用",
 	"lblLab": "實驗構建\n(刪除後測試)",
 	"performanceSw": "啟用性能調整",

+ 5 - 4
README.md

@@ -3,7 +3,7 @@
 </p> 
 
 <p align="center">
-	<a href="https://github.com/hellzerg/optimizer/releases/download/13.1/Optimizer-13.1.exe" target="_blank">
+	<a href="https://github.com/hellzerg/optimizer/releases/download/13.2/Optimizer-13.2.exe" target="_blank">
 		<img src="https://raw.githubusercontent.com/hellzerg/optimizer/master/download-button.png">
 		<br>
 		<img src="https://raw.githubusercontent.com/hellzerg/optimizer/master/flags.png">
@@ -32,6 +32,7 @@ Depending on your version of Windows, Optimizer will also allow you to perform s
 * Flush DNS cache
 * Remove unwanted programs running at startup
 * Edit your HOSTS file
+* Find file lock handles and kill associated processes
 * Network speed monitoring
 * Hardware inspection tool
 * Add items in desktop on right-click menu
@@ -69,9 +70,9 @@ https://github.com/hellzerg/optimizer/blob/master/LEGACY.md
 
 ### #️ Details: ###
 
-* Latest version: 13.1
-* Released: May 7, 2022
-* SHA256: 3DEA7B625265F9C99610886D7DE25851E2EB7AD6581E0B46336D4ED43D137693
+* Latest version: 13.2
+* Released: May 8, 2022
+* SHA256: 3878A6A1EBDAA918BEDA7A765807A0AAD34A04B7E3F0A5F96838C72FF492C2A6
 
 ### ☕ Buy me a delicious espresso ###
 Support my hard work by donating me through [PayPal](https://www.paypal.com/paypalme/supportoptimizer)

BIN
flags.png.next


+ 1 - 1
version.txt

@@ -1 +1 @@
-13.1
+13.2