Feature: Detection of inaccessible folders

When a folder cannot be accessed due to rights management, it will show 'inaccessible' instead of 'empty'
This commit is contained in:
Peter Kirmeier 2019-07-05 23:09:55 +02:00
parent c2845ee3f3
commit 5dd5e68d3d
6 changed files with 649 additions and 608 deletions

View file

@ -20,6 +20,7 @@ namespace SystemTrayMenu
Main, Main,
Sub, Sub,
Empty, Empty,
NoAccess,
MaxReached MaxReached
} }
@ -69,6 +70,10 @@ namespace SystemTrayMenu
{ {
SetType(Type.Empty); SetType(Type.Empty);
} }
public void SetTypeNoAccess()
{
SetType(Type.NoAccess);
}
public void SetType(Type type) public void SetType(Type type)
{ {
@ -84,6 +89,10 @@ namespace SystemTrayMenu
SetTitle(Program.Translate("Folder empty")); SetTitle(Program.Translate("Folder empty"));
labelTitle.BackColor = MenuDefines.Background; labelTitle.BackColor = MenuDefines.Background;
break; break;
case Type.NoAccess:
SetTitle(Program.Translate("Folder inaccessible"));
labelTitle.BackColor = MenuDefines.Background;
break;
case Type.MaxReached: case Type.MaxReached:
SetTitle($"Max {MenuDefines.MenusMax - 1} Menus"); SetTitle($"Max {MenuDefines.MenusMax - 1} Menus");
labelTitle.BackColor = MenuDefines.Background; labelTitle.BackColor = MenuDefines.Background;

View file

@ -15,10 +15,17 @@ using TAFactory.IconPack;
namespace SystemTrayMenu.Controls namespace SystemTrayMenu.Controls
{ {
public enum MenuDataValidity
{
Valid,
Invalid,
NoAccess
}
public struct MenuData public struct MenuData
{ {
public List<RowData> RowDatas; public List<RowData> RowDatas;
public bool Valid; public MenuDataValidity Validity;
public int Level; public int Level;
}; };
} }

View file

@ -1,243 +1,252 @@
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// <auto-generated> // <auto-generated>
// Dieser Code wurde von einem Tool generiert. // Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000 // Laufzeitversion:4.0.30319.42000
// //
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn // Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird. // der Code erneut generiert wird.
// </auto-generated> // </auto-generated>
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
namespace SystemTrayMenu.Resources { namespace SystemTrayMenu.Resources {
using System; using System;
/// <summary> /// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// </summary> /// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert
// -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert.
// Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen
// mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class lang { internal class lang {
private static global::System.Resources.ResourceManager resourceMan; private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture; private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal lang() { internal lang() {
} }
/// <summary> /// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager { internal static global::System.Resources.ResourceManager ResourceManager {
get { get {
if (object.ReferenceEquals(resourceMan, null)) { if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SystemTrayMenu.Resources.lang", typeof(lang).Assembly); global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SystemTrayMenu.Resources.lang", typeof(lang).Assembly);
resourceMan = temp; resourceMan = temp;
} }
return resourceMan; return resourceMan;
} }
} }
/// <summary> /// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// </summary> /// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture { internal static global::System.Globalization.CultureInfo Culture {
get { get {
return resourceCulture; return resourceCulture;
} }
set { set {
resourceCulture = value; resourceCulture = value;
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die (e.g. F12) ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die (e.g. F12) ähnelt.
/// </summary> /// </summary>
internal static string _e_g__F12_ { internal static string _e_g__F12_ {
get { get {
return ResourceManager.GetString("(e.g. F12)", resourceCulture); return ResourceManager.GetString("(e.g. F12)", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die About ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die About ähnelt.
/// </summary> /// </summary>
internal static string About { internal static string About {
get { get {
return ResourceManager.GetString("About", resourceCulture); return ResourceManager.GetString("About", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Activate autostart ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die Activate autostart ähnelt.
/// </summary> /// </summary>
internal static string Activate_autostart { internal static string Activate_autostart {
get { get {
return ResourceManager.GetString("Activate autostart", resourceCulture); return ResourceManager.GetString("Activate autostart", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die ALT ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die ALT ähnelt.
/// </summary> /// </summary>
internal static string ALT { internal static string ALT {
get { get {
return ResourceManager.GetString("ALT", resourceCulture); return ResourceManager.GetString("ALT", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Autostart ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die Autostart ähnelt.
/// </summary> /// </summary>
internal static string Autostart { internal static string Autostart {
get { get {
return ResourceManager.GetString("Autostart", resourceCulture); return ResourceManager.GetString("Autostart", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Details ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die Details ähnelt.
/// </summary> /// </summary>
internal static string buttonDetails { internal static string buttonDetails {
get { get {
return ResourceManager.GetString("buttonDetails", resourceCulture); return ResourceManager.GetString("buttonDetails", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die OK ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die OK ähnelt.
/// </summary> /// </summary>
internal static string buttonOk { internal static string buttonOk {
get { get {
return ResourceManager.GetString("buttonOk", resourceCulture); return ResourceManager.GetString("buttonOk", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die System Info ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die System Info ähnelt.
/// </summary> /// </summary>
internal static string buttonSystemInfo { internal static string buttonSystemInfo {
get { get {
return ResourceManager.GetString("buttonSystemInfo", resourceCulture); return ResourceManager.GetString("buttonSystemInfo", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die CTRL ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die CTRL ähnelt.
/// </summary> /// </summary>
internal static string CTRL { internal static string CTRL {
get { get {
return ResourceManager.GetString("CTRL", resourceCulture); return ResourceManager.GetString("CTRL", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die English ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die English ähnelt.
/// </summary> /// </summary>
internal static string English { internal static string English {
get { get {
return ResourceManager.GetString("English", resourceCulture); return ResourceManager.GetString("English", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Exit ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die Exit ähnelt.
/// </summary> /// </summary>
internal static string Exit { internal static string Exit {
get { get {
return ResourceManager.GetString("Exit", resourceCulture); return ResourceManager.GetString("Exit", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Folder ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die Folder ähnelt.
/// </summary> /// </summary>
internal static string Folder { internal static string Folder {
get { get {
return ResourceManager.GetString("Folder", resourceCulture); return ResourceManager.GetString("Folder", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Folder empty ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die Folder empty ähnelt.
/// </summary> /// </summary>
internal static string Folder_empty { internal static string Folder_empty {
get { get {
return ResourceManager.GetString("Folder empty", resourceCulture); return ResourceManager.GetString("Folder empty", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Deutsch ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die Folder inaccessible ähnelt.
/// </summary> /// </summary>
internal static string German { internal static string Folder_inaccessible {
get { get {
return ResourceManager.GetString("German", resourceCulture); return ResourceManager.GetString("Folder inaccessible", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Move the NotifyIcon per DragDrop from the SystemTray into the Taskbar ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die Deutsch ähnelt.
/// </summary> /// </summary>
internal static string HintDragDropText { internal static string German {
get { get {
return ResourceManager.GetString("HintDragDropText", resourceCulture); return ResourceManager.GetString("German", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die SystemTrayMenu - Hint ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die Move the NotifyIcon per DragDrop from the SystemTray into the Taskbar ähnelt.
/// </summary> /// </summary>
internal static string HintDragDropTitle { internal static string HintDragDropText {
get { get {
return ResourceManager.GetString("HintDragDropTitle", resourceCulture); return ResourceManager.GetString("HintDragDropText", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Language ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die SystemTrayMenu - Hint ähnelt.
/// </summary> /// </summary>
internal static string Language { internal static string HintDragDropTitle {
get { get {
return ResourceManager.GetString("Language", resourceCulture); return ResourceManager.GetString("HintDragDropTitle", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Log File ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die Language ähnelt.
/// </summary> /// </summary>
internal static string Log_File { internal static string Language {
get { get {
return ResourceManager.GetString("Log File", resourceCulture); return ResourceManager.GetString("Language", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Restart ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die Log File ähnelt.
/// </summary> /// </summary>
internal static string Restart { internal static string Log_File {
get { get {
return ResourceManager.GetString("Restart", resourceCulture); return ResourceManager.GetString("Log File", resourceCulture);
} }
} }
/// <summary> /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Shortcut key ähnelt. /// Sucht eine lokalisierte Zeichenfolge, die Restart ähnelt.
/// </summary> /// </summary>
internal static string Shortcut_key { internal static string Restart {
get { get {
return ResourceManager.GetString("Shortcut key", resourceCulture); return ResourceManager.GetString("Restart", resourceCulture);
} }
} }
}
} /// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Shortcut key ähnelt.
/// </summary>
internal static string Shortcut_key {
get {
return ResourceManager.GetString("Shortcut key", resourceCulture);
}
}
}
}

View file

@ -1,180 +1,183 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<root> <root>
<!-- <!--
Microsoft ResX Schema Microsoft ResX Schema
Version 2.0 Version 2.0
The primary goals of this format is to allow a simple XML format The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes various data types are done through the TypeConverter classes
associated with the data types. associated with the data types.
Example: Example:
... ado.net/XML headers & schema ... ... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader> <resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, 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="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="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value> <value>[base64 mime encoded serialized .NET Framework object]</value>
</data> </data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <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> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment> <comment>This is a comment</comment>
</data> </data>
There are any number of "resheader" rows that contain simple There are any number of "resheader" rows that contain simple
name/value pairs. name/value pairs.
Each data row contains a name, and value. The row also contains a Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture. text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the Classes that don't support this are serialized and stored with the
mimetype set. mimetype set.
The mimetype is used for serialized objects, and tells the The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly: extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below. read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64 mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64 mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64 mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter : using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding. : 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: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:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata"> <xsd:element name="metadata">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" /> <xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" /> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="assembly"> <xsd:element name="assembly">
<xsd:complexType> <xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="data"> <xsd:element name="data">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <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:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <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="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" /> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="resheader"> <xsd:element name="resheader">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" /> <xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:choice> </xsd:choice>
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:schema> </xsd:schema>
<resheader name="resmimetype"> <resheader name="resmimetype">
<value>text/microsoft-resx</value> <value>text/microsoft-resx</value>
</resheader> </resheader>
<resheader name="version"> <resheader name="version">
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="About" xml:space="preserve"> <data name="About" xml:space="preserve">
<value>Über</value> <value>Über</value>
</data> </data>
<data name="Activate autostart" xml:space="preserve"> <data name="Activate autostart" xml:space="preserve">
<value>Autostart aktivieren</value> <value>Autostart aktivieren</value>
</data> </data>
<data name="buttonOk" xml:space="preserve"> <data name="buttonOk" xml:space="preserve">
<value>OK</value> <value>OK</value>
</data> </data>
<data name="Autostart" xml:space="preserve"> <data name="Autostart" xml:space="preserve">
<value>Autostart</value> <value>Autostart</value>
</data> </data>
<data name="Exit" xml:space="preserve"> <data name="Exit" xml:space="preserve">
<value>Beenden</value> <value>Beenden</value>
</data> </data>
<data name="Folder" xml:space="preserve"> <data name="Folder" xml:space="preserve">
<value>Ordner</value> <value>Ordner</value>
</data> </data>
<data name="HintDragDropText" xml:space="preserve"> <data name="Folder empty" xml:space="preserve">
<value>Ziehe das Notify-Icon per DragDrop vom SystemTray in die Taskleiste</value> <value>Ordner leer</value>
</data> </data>
<data name="HintDragDropTitle" xml:space="preserve"> <data name="ALT" xml:space="preserve">
<value>SystemTrayMenu - Hinweis</value> <value>ALT</value>
</data> </data>
<data name="Language" xml:space="preserve"> <data name="CTRL" xml:space="preserve">
<value>Sprache</value> <value>STRG</value>
</data> </data>
<data name="Log File" xml:space="preserve"> <data name="English" xml:space="preserve">
<value>Log Datei</value> <value>English</value>
</data> </data>
<data name="Restart" xml:space="preserve"> <data name="(e.g. F12)" xml:space="preserve">
<value>Neustart</value> <value>(z.B. F12)</value>
</data> </data>
<data name="Folder empty" xml:space="preserve"> <data name="buttonDetails" xml:space="preserve">
<value>Ordner leer</value> <value>Details</value>
</data> </data>
<data name="ALT" xml:space="preserve"> <data name="buttonSystemInfo" xml:space="preserve">
<value>ALT</value> <value>System Info</value>
</data> </data>
<data name="CTRL" xml:space="preserve"> <data name="Folder inaccessible" xml:space="preserve">
<value>STRG</value> <value>Ordner unzugänglich</value>
</data> </data>
<data name="Shortcut key" xml:space="preserve"> <data name="German" xml:space="preserve">
<value>Tastenkombination</value> <value>Deutsch</value>
</data> </data>
<data name="English" xml:space="preserve"> <data name="HintDragDropText" xml:space="preserve">
<value>English</value> <value>Ziehe das Notify-Icon per DragDrop vom SystemTray in die Taskleiste</value>
</data> </data>
<data name="German" xml:space="preserve"> <data name="HintDragDropTitle" xml:space="preserve">
<value>Deutsch</value> <value>SystemTrayMenu - Hinweis</value>
</data> </data>
<data name="(e.g. F12)" xml:space="preserve"> <data name="Language" xml:space="preserve">
<value>(z.B. F12)</value> <value>Sprache</value>
</data> </data>
<data name="buttonDetails" xml:space="preserve"> <data name="Log File" xml:space="preserve">
<value>Details</value> <value>Log Datei</value>
</data> </data>
<data name="buttonSystemInfo" xml:space="preserve"> <data name="Restart" xml:space="preserve">
<value>System Info</value> <value>Neustart</value>
</data> </data>
<data name="Shortcut key" xml:space="preserve">
<value>Tastenkombination</value>
</data>
</root> </root>

View file

@ -1,180 +1,183 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<root> <root>
<!-- <!--
Microsoft ResX Schema Microsoft ResX Schema
Version 2.0 Version 2.0
The primary goals of this format is to allow a simple XML format The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes various data types are done through the TypeConverter classes
associated with the data types. associated with the data types.
Example: Example:
... ado.net/XML headers & schema ... ... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader> <resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader> <resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, 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="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="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value> <value>[base64 mime encoded serialized .NET Framework object]</value>
</data> </data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <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> <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment> <comment>This is a comment</comment>
</data> </data>
There are any number of "resheader" rows that contain simple There are any number of "resheader" rows that contain simple
name/value pairs. name/value pairs.
Each data row contains a name, and value. The row also contains a Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture. text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the Classes that don't support this are serialized and stored with the
mimetype set. mimetype set.
The mimetype is used for serialized objects, and tells the The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly: extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below. read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64 mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64 mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding. : and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64 mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter : using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding. : 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: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:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true"> <xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType> <xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata"> <xsd:element name="metadata">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" /> <xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" /> <xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" /> <xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" /> <xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" /> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="assembly"> <xsd:element name="assembly">
<xsd:complexType> <xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" /> <xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" /> <xsd:attribute name="name" type="xsd:string" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="data"> <xsd:element name="data">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <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:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" /> <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="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" /> <xsd:attribute ref="xml:space" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
<xsd:element name="resheader"> <xsd:element name="resheader">
<xsd:complexType> <xsd:complexType>
<xsd:sequence> <xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence> </xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" /> <xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:choice> </xsd:choice>
</xsd:complexType> </xsd:complexType>
</xsd:element> </xsd:element>
</xsd:schema> </xsd:schema>
<resheader name="resmimetype"> <resheader name="resmimetype">
<value>text/microsoft-resx</value> <value>text/microsoft-resx</value>
</resheader> </resheader>
<resheader name="version"> <resheader name="version">
<value>2.0</value> <value>2.0</value>
</resheader> </resheader>
<resheader name="reader"> <resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<resheader name="writer"> <resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<data name="About" xml:space="preserve"> <data name="About" xml:space="preserve">
<value>About</value> <value>About</value>
</data> </data>
<data name="Activate autostart" xml:space="preserve"> <data name="Activate autostart" xml:space="preserve">
<value>Activate autostart</value> <value>Activate autostart</value>
</data> </data>
<data name="buttonOk" xml:space="preserve"> <data name="buttonOk" xml:space="preserve">
<value>OK</value> <value>OK</value>
</data> </data>
<data name="Autostart" xml:space="preserve"> <data name="Autostart" xml:space="preserve">
<value>Autostart</value> <value>Autostart</value>
</data> </data>
<data name="English" xml:space="preserve"> <data name="English" xml:space="preserve">
<value>English</value> <value>English</value>
</data> </data>
<data name="Exit" xml:space="preserve"> <data name="Exit" xml:space="preserve">
<value>Exit</value> <value>Exit</value>
</data> </data>
<data name="Folder" xml:space="preserve"> <data name="Folder" xml:space="preserve">
<value>Folder</value> <value>Folder</value>
</data> </data>
<data name="German" xml:space="preserve"> <data name="Folder empty" xml:space="preserve">
<value>Deutsch</value> <value>Folder empty</value>
</data> </data>
<data name="HintDragDropText" xml:space="preserve"> <data name="ALT" xml:space="preserve">
<value>Move the NotifyIcon per DragDrop from the SystemTray into the Taskbar</value> <value>ALT</value>
</data> </data>
<data name="HintDragDropTitle" xml:space="preserve"> <data name="CTRL" xml:space="preserve">
<value>SystemTrayMenu - Hint</value> <value>CTRL</value>
</data> </data>
<data name="Language" xml:space="preserve"> <data name="(e.g. F12)" xml:space="preserve">
<value>Language</value> <value>(e.g. F12)</value>
</data> </data>
<data name="Log File" xml:space="preserve"> <data name="buttonDetails" xml:space="preserve">
<value>Log File</value> <value>Details</value>
</data> </data>
<data name="Restart" xml:space="preserve"> <data name="buttonSystemInfo" xml:space="preserve">
<value>Restart</value> <value>System Info</value>
</data> </data>
<data name="Folder empty" xml:space="preserve"> <data name="Folder inaccessible" xml:space="preserve">
<value>Folder empty</value> <value>Folder inaccessible</value>
</data> </data>
<data name="ALT" xml:space="preserve"> <data name="German" xml:space="preserve">
<value>ALT</value> <value>Deutsch</value>
</data> </data>
<data name="CTRL" xml:space="preserve"> <data name="HintDragDropText" xml:space="preserve">
<value>CTRL</value> <value>Move the NotifyIcon per DragDrop from the SystemTray into the Taskbar</value>
</data> </data>
<data name="Shortcut key" xml:space="preserve"> <data name="HintDragDropTitle" xml:space="preserve">
<value>Shortcut key</value> <value>SystemTrayMenu - Hint</value>
</data> </data>
<data name="(e.g. F12)" xml:space="preserve"> <data name="Language" xml:space="preserve">
<value>(e.g. F12)</value> <value>Language</value>
</data> </data>
<data name="buttonDetails" xml:space="preserve"> <data name="Log File" xml:space="preserve">
<value>Details</value> <value>Log File</value>
</data> </data>
<data name="buttonSystemInfo" xml:space="preserve"> <data name="Restart" xml:space="preserve">
<value>System Info</value> <value>Restart</value>
</data> </data>
<data name="Shortcut key" xml:space="preserve">
<value>Shortcut key</value>
</data>
</root> </root>

View file

@ -160,7 +160,7 @@ namespace SystemTrayMenu
ResetSelectedByKey(); ResetSelectedByKey();
menuNotifyIcon.LoadingStop(); menuNotifyIcon.LoadingStop();
MenuData menuData = (MenuData)e.Result; MenuData menuData = (MenuData)e.Result;
if (menuData.Valid) if (menuData.Validity == MenuDataValidity.Valid)
{ {
menus[0] = CreateMenu(menuData, Path.GetFileName(Config.Path)); menus[0] = CreateMenu(menuData, Path.GetFileName(Config.Path));
menus[0].AdjustLocationAndSize(screen); menus[0].AdjustLocationAndSize(screen);
@ -397,7 +397,7 @@ namespace SystemTrayMenu
{ {
MenuData menuData = new MenuData(); MenuData menuData = new MenuData();
menuData.RowDatas = new List<RowData>(); menuData.RowDatas = new List<RowData>();
menuData.Valid = false; menuData.Validity = MenuDataValidity.Invalid;
menuData.Level = level; menuData.Level = level;
if (!worker.CancellationPending) if (!worker.CancellationPending)
{ {
@ -441,8 +441,13 @@ namespace SystemTrayMenu
} }
catch (Exception ex) catch (Exception ex)
{ {
log.Info($"path:'{path}'"); if ((uint)ex.HResult == 0x80070005) // E_ACCESSDENIED
log.Error($"{ex.ToString()}"); menuData.Validity = MenuDataValidity.NoAccess;
else
{
log.Info($"path:'{path}'");
log.Error($"{ex.ToString()}");
}
} }
foreach (string file in files) foreach (string file in files)
@ -468,7 +473,8 @@ namespace SystemTrayMenu
if (!worker.CancellationPending) if (!worker.CancellationPending)
{ {
menuData.Valid = true; if (menuData.Validity == MenuDataValidity.Invalid)
menuData.Validity = MenuDataValidity.Valid;
} }
return menuData; return menuData;
@ -1064,13 +1070,17 @@ namespace SystemTrayMenu
{ {
menuNotifyIcon.LoadingStop(); menuNotifyIcon.LoadingStop();
menuNotifyIcon.LoadWait(); menuNotifyIcon.LoadWait();
if (menuData.Valid) if (menuData.Validity != MenuDataValidity.Invalid)
{ {
menu = CreateMenu(menuData); menu = CreateMenu(menuData);
if (menuData.RowDatas.Count > 0) if (menuData.RowDatas.Count > 0)
{ {
menu.SetTypeSub(); menu.SetTypeSub();
} }
else if (menuData.Validity == MenuDataValidity.NoAccess)
{
menu.SetTypeNoAccess();
}
else else
{ {
menu.SetTypeEmpty(); menu.SetTypeEmpty();