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

View file

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

View file

@ -1,243 +1,252 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000
//
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------
namespace SystemTrayMenu.Resources {
using System;
/// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder 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
// 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.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class lang {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal lang() {
}
/// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SystemTrayMenu.Resources.lang", typeof(lang).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die (e.g. F12) ähnelt.
/// </summary>
internal static string _e_g__F12_ {
get {
return ResourceManager.GetString("(e.g. F12)", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die About ähnelt.
/// </summary>
internal static string About {
get {
return ResourceManager.GetString("About", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Activate autostart ähnelt.
/// </summary>
internal static string Activate_autostart {
get {
return ResourceManager.GetString("Activate autostart", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die ALT ähnelt.
/// </summary>
internal static string ALT {
get {
return ResourceManager.GetString("ALT", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Autostart ähnelt.
/// </summary>
internal static string Autostart {
get {
return ResourceManager.GetString("Autostart", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Details ähnelt.
/// </summary>
internal static string buttonDetails {
get {
return ResourceManager.GetString("buttonDetails", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die OK ähnelt.
/// </summary>
internal static string buttonOk {
get {
return ResourceManager.GetString("buttonOk", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die System Info ähnelt.
/// </summary>
internal static string buttonSystemInfo {
get {
return ResourceManager.GetString("buttonSystemInfo", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die CTRL ähnelt.
/// </summary>
internal static string CTRL {
get {
return ResourceManager.GetString("CTRL", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die English ähnelt.
/// </summary>
internal static string English {
get {
return ResourceManager.GetString("English", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Exit ähnelt.
/// </summary>
internal static string Exit {
get {
return ResourceManager.GetString("Exit", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Folder ähnelt.
/// </summary>
internal static string Folder {
get {
return ResourceManager.GetString("Folder", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Folder empty ähnelt.
/// </summary>
internal static string Folder_empty {
get {
return ResourceManager.GetString("Folder empty", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Deutsch ähnelt.
/// </summary>
internal static string German {
get {
return ResourceManager.GetString("German", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Move the NotifyIcon per DragDrop from the SystemTray into the Taskbar ähnelt.
/// </summary>
internal static string HintDragDropText {
get {
return ResourceManager.GetString("HintDragDropText", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die SystemTrayMenu - Hint ähnelt.
/// </summary>
internal static string HintDragDropTitle {
get {
return ResourceManager.GetString("HintDragDropTitle", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Language ähnelt.
/// </summary>
internal static string Language {
get {
return ResourceManager.GetString("Language", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Log File ähnelt.
/// </summary>
internal static string Log_File {
get {
return ResourceManager.GetString("Log File", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Restart ähnelt.
/// </summary>
internal static string Restart {
get {
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);
}
}
}
}
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.42000
//
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------
namespace SystemTrayMenu.Resources {
using System;
/// <summary>
/// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw.
/// </summary>
// Diese Klasse wurde von der StronglyTypedResourceBuilder 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
// 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.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class lang {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal lang() {
}
/// <summary>
/// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SystemTrayMenu.Resources.lang", typeof(lang).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle
/// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die (e.g. F12) ähnelt.
/// </summary>
internal static string _e_g__F12_ {
get {
return ResourceManager.GetString("(e.g. F12)", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die About ähnelt.
/// </summary>
internal static string About {
get {
return ResourceManager.GetString("About", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Activate autostart ähnelt.
/// </summary>
internal static string Activate_autostart {
get {
return ResourceManager.GetString("Activate autostart", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die ALT ähnelt.
/// </summary>
internal static string ALT {
get {
return ResourceManager.GetString("ALT", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Autostart ähnelt.
/// </summary>
internal static string Autostart {
get {
return ResourceManager.GetString("Autostart", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Details ähnelt.
/// </summary>
internal static string buttonDetails {
get {
return ResourceManager.GetString("buttonDetails", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die OK ähnelt.
/// </summary>
internal static string buttonOk {
get {
return ResourceManager.GetString("buttonOk", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die System Info ähnelt.
/// </summary>
internal static string buttonSystemInfo {
get {
return ResourceManager.GetString("buttonSystemInfo", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die CTRL ähnelt.
/// </summary>
internal static string CTRL {
get {
return ResourceManager.GetString("CTRL", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die English ähnelt.
/// </summary>
internal static string English {
get {
return ResourceManager.GetString("English", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Exit ähnelt.
/// </summary>
internal static string Exit {
get {
return ResourceManager.GetString("Exit", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Folder ähnelt.
/// </summary>
internal static string Folder {
get {
return ResourceManager.GetString("Folder", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Folder empty ähnelt.
/// </summary>
internal static string Folder_empty {
get {
return ResourceManager.GetString("Folder empty", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Folder inaccessible ähnelt.
/// </summary>
internal static string Folder_inaccessible {
get {
return ResourceManager.GetString("Folder inaccessible", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Deutsch ähnelt.
/// </summary>
internal static string German {
get {
return ResourceManager.GetString("German", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Move the NotifyIcon per DragDrop from the SystemTray into the Taskbar ähnelt.
/// </summary>
internal static string HintDragDropText {
get {
return ResourceManager.GetString("HintDragDropText", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die SystemTrayMenu - Hint ähnelt.
/// </summary>
internal static string HintDragDropTitle {
get {
return ResourceManager.GetString("HintDragDropTitle", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Language ähnelt.
/// </summary>
internal static string Language {
get {
return ResourceManager.GetString("Language", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Log File ähnelt.
/// </summary>
internal static string Log_File {
get {
return ResourceManager.GetString("Log File", resourceCulture);
}
}
/// <summary>
/// Sucht eine lokalisierte Zeichenfolge, die Restart ähnelt.
/// </summary>
internal static string Restart {
get {
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"?>
<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>
<data name="About" xml:space="preserve">
<value>Über</value>
</data>
<data name="Activate autostart" xml:space="preserve">
<value>Autostart aktivieren</value>
</data>
<data name="buttonOk" xml:space="preserve">
<value>OK</value>
</data>
<data name="Autostart" xml:space="preserve">
<value>Autostart</value>
</data>
<data name="Exit" xml:space="preserve">
<value>Beenden</value>
</data>
<data name="Folder" xml:space="preserve">
<value>Ordner</value>
</data>
<data name="HintDragDropText" xml:space="preserve">
<value>Ziehe das Notify-Icon per DragDrop vom SystemTray in die Taskleiste</value>
</data>
<data name="HintDragDropTitle" xml:space="preserve">
<value>SystemTrayMenu - Hinweis</value>
</data>
<data name="Language" xml:space="preserve">
<value>Sprache</value>
</data>
<data name="Log File" xml:space="preserve">
<value>Log Datei</value>
</data>
<data name="Restart" xml:space="preserve">
<value>Neustart</value>
</data>
<data name="Folder empty" xml:space="preserve">
<value>Ordner leer</value>
</data>
<data name="ALT" xml:space="preserve">
<value>ALT</value>
</data>
<data name="CTRL" xml:space="preserve">
<value>STRG</value>
</data>
<data name="Shortcut key" xml:space="preserve">
<value>Tastenkombination</value>
</data>
<data name="English" xml:space="preserve">
<value>English</value>
</data>
<data name="German" xml:space="preserve">
<value>Deutsch</value>
</data>
<data name="(e.g. F12)" xml:space="preserve">
<value>(z.B. F12)</value>
</data>
<data name="buttonDetails" xml:space="preserve">
<value>Details</value>
</data>
<data name="buttonSystemInfo" xml:space="preserve">
<value>System Info</value>
</data>
<?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>
<data name="About" xml:space="preserve">
<value>Über</value>
</data>
<data name="Activate autostart" xml:space="preserve">
<value>Autostart aktivieren</value>
</data>
<data name="buttonOk" xml:space="preserve">
<value>OK</value>
</data>
<data name="Autostart" xml:space="preserve">
<value>Autostart</value>
</data>
<data name="Exit" xml:space="preserve">
<value>Beenden</value>
</data>
<data name="Folder" xml:space="preserve">
<value>Ordner</value>
</data>
<data name="Folder empty" xml:space="preserve">
<value>Ordner leer</value>
</data>
<data name="ALT" xml:space="preserve">
<value>ALT</value>
</data>
<data name="CTRL" xml:space="preserve">
<value>STRG</value>
</data>
<data name="English" xml:space="preserve">
<value>English</value>
</data>
<data name="(e.g. F12)" xml:space="preserve">
<value>(z.B. F12)</value>
</data>
<data name="buttonDetails" xml:space="preserve">
<value>Details</value>
</data>
<data name="buttonSystemInfo" xml:space="preserve">
<value>System Info</value>
</data>
<data name="Folder inaccessible" xml:space="preserve">
<value>Ordner unzugänglich</value>
</data>
<data name="German" xml:space="preserve">
<value>Deutsch</value>
</data>
<data name="HintDragDropText" xml:space="preserve">
<value>Ziehe das Notify-Icon per DragDrop vom SystemTray in die Taskleiste</value>
</data>
<data name="HintDragDropTitle" xml:space="preserve">
<value>SystemTrayMenu - Hinweis</value>
</data>
<data name="Language" xml:space="preserve">
<value>Sprache</value>
</data>
<data name="Log File" xml:space="preserve">
<value>Log Datei</value>
</data>
<data name="Restart" xml:space="preserve">
<value>Neustart</value>
</data>
<data name="Shortcut key" xml:space="preserve">
<value>Tastenkombination</value>
</data>
</root>

View file

@ -1,180 +1,183 @@
<?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>
<data name="About" xml:space="preserve">
<value>About</value>
</data>
<data name="Activate autostart" xml:space="preserve">
<value>Activate autostart</value>
</data>
<data name="buttonOk" xml:space="preserve">
<value>OK</value>
</data>
<data name="Autostart" xml:space="preserve">
<value>Autostart</value>
</data>
<data name="English" xml:space="preserve">
<value>English</value>
</data>
<data name="Exit" xml:space="preserve">
<value>Exit</value>
</data>
<data name="Folder" xml:space="preserve">
<value>Folder</value>
</data>
<data name="German" xml:space="preserve">
<value>Deutsch</value>
</data>
<data name="HintDragDropText" xml:space="preserve">
<value>Move the NotifyIcon per DragDrop from the SystemTray into the Taskbar</value>
</data>
<data name="HintDragDropTitle" xml:space="preserve">
<value>SystemTrayMenu - Hint</value>
</data>
<data name="Language" xml:space="preserve">
<value>Language</value>
</data>
<data name="Log File" xml:space="preserve">
<value>Log File</value>
</data>
<data name="Restart" xml:space="preserve">
<value>Restart</value>
</data>
<data name="Folder empty" xml:space="preserve">
<value>Folder empty</value>
</data>
<data name="ALT" xml:space="preserve">
<value>ALT</value>
</data>
<data name="CTRL" xml:space="preserve">
<value>CTRL</value>
</data>
<data name="Shortcut key" xml:space="preserve">
<value>Shortcut key</value>
</data>
<data name="(e.g. F12)" xml:space="preserve">
<value>(e.g. F12)</value>
</data>
<data name="buttonDetails" xml:space="preserve">
<value>Details</value>
</data>
<data name="buttonSystemInfo" xml:space="preserve">
<value>System Info</value>
</data>
<?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>
<data name="About" xml:space="preserve">
<value>About</value>
</data>
<data name="Activate autostart" xml:space="preserve">
<value>Activate autostart</value>
</data>
<data name="buttonOk" xml:space="preserve">
<value>OK</value>
</data>
<data name="Autostart" xml:space="preserve">
<value>Autostart</value>
</data>
<data name="English" xml:space="preserve">
<value>English</value>
</data>
<data name="Exit" xml:space="preserve">
<value>Exit</value>
</data>
<data name="Folder" xml:space="preserve">
<value>Folder</value>
</data>
<data name="Folder empty" xml:space="preserve">
<value>Folder empty</value>
</data>
<data name="ALT" xml:space="preserve">
<value>ALT</value>
</data>
<data name="CTRL" xml:space="preserve">
<value>CTRL</value>
</data>
<data name="(e.g. F12)" xml:space="preserve">
<value>(e.g. F12)</value>
</data>
<data name="buttonDetails" xml:space="preserve">
<value>Details</value>
</data>
<data name="buttonSystemInfo" xml:space="preserve">
<value>System Info</value>
</data>
<data name="Folder inaccessible" xml:space="preserve">
<value>Folder inaccessible</value>
</data>
<data name="German" xml:space="preserve">
<value>Deutsch</value>
</data>
<data name="HintDragDropText" xml:space="preserve">
<value>Move the NotifyIcon per DragDrop from the SystemTray into the Taskbar</value>
</data>
<data name="HintDragDropTitle" xml:space="preserve">
<value>SystemTrayMenu - Hint</value>
</data>
<data name="Language" xml:space="preserve">
<value>Language</value>
</data>
<data name="Log File" xml:space="preserve">
<value>Log File</value>
</data>
<data name="Restart" xml:space="preserve">
<value>Restart</value>
</data>
<data name="Shortcut key" xml:space="preserve">
<value>Shortcut key</value>
</data>
</root>

View file

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