2016-03-21 8 views
1

Ich verwende die Vorlage von https://alanbondo.wordpress.com/2008/06/22/creating-a-system-tray-app-with-c/ zum Erstellen eines Taskleistensymbols, das über ein Kontextmenü verfügt.Numerieren Sie den Inhalt von Ordnern/Unterordnern mit der rechten Maustaste auf das Kontextmenü der Taskleiste in C#

ich in der Lage bin eine der Tasten haben einen Explorer-Prozess starten, der an die Wurzel eines Verzeichnisses öffnet mit dieser Funktion

private void MyApps(object sender, EventArgs e) 
    { 
     String currentUser = Environment.UserName.ToString(); 
     Process explorer = new Process(); 
     explorer.StartInfo.FileName = "explorer.exe"; 
     explorer.StartInfo.Arguments = @"C:\Users\" + currentUser + @"\desktop\MyApps"; 
     explorer.StartInfo.WindowStyle = ProcessWindowStyle.Normal; 
     explorer.Start(); 
    } 

Was würde ich lieber tun, ist das System Tray-Icon-Taste hat, wenn Klicken Sie auf, erweitern Sie in ein Untermenü, das den Inhalt des gewünschten Verzeichnisses enthält, das selbst durchsuchbare Unterordner enthält. Stellen Sie sich das Startmenü (vor Windows 8) mit verschachtelten Menüs und Anwendungen vor. das ist das Verhalten, das ich nachahmen möchte.

Was ich bis jetzt gefunden habe, sind mehrere Projekte, die Leute geschrieben haben, um ihre eigene angepasste Windows Explorer-Shell zu erstellen, müssen tatsächlich so weit gehen, um den Inhalt des gewünschten Ordners im Rechtsklick-Kontextmenü dynamisch aufzuzählen eines Taskleistensymbols?

Ich bin viel bequeme Visual Studio Formulare für .NET-Anwendungen verwenden, aber von dem, was ich gelesen habe, gibt es keinen Weg, um tatsächlich ‚verstecken‘ die Form beim Start, so jetzt ich C# bin mit

Irgendwelche Ratschläge oder Vorschläge würden geschätzt. Vielen Dank!

Bearbeiten: Hier ist der aktualisierte Code mit der vorgeschlagenen Methode zum rekursiven Auffüllen des Menüelements mit dem Inhalt des angegebenen Verzeichnisses. Ich bin jetzt erhalte eine Fehlermeldung, dass „System.Windows.Forms.MenuItem“ enthält keine Definition für DropDownItems

using System; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Diagnostics; 
using System.IO; 



namespace MyTrayApp 
{ 
    public class SysTrayApp : Form 
    { 
     [STAThread] 
     public static void Main() 
     { 
      Application.Run(new SysTrayApp()); 
     } 

     private NotifyIcon trayIcon; 
     private ContextMenu trayMenu; 

     public SysTrayApp() 
     { 
      trayMenu = new ContextMenu(); 
      trayMenu.MenuItems.Add("Exit", OnExit); 
      trayMenu.MenuItems.Add("My Applications").Click += new EventHandler(MyApps); 

      trayIcon = new NotifyIcon(); 
      trayIcon.Text = "MyTrayApp"; 
      trayIcon.Icon = new Icon(SystemIcons.Application, 40, 40); 

      trayIcon.ContextMenu = trayMenu; 
      trayIcon.Visible = true; 
     } 

     protected override void OnLoad(EventArgs e) 
     { 
      Visible = false; // Hide form window. 
      ShowInTaskbar = false; // Remove from taskbar. 

      base.OnLoad(e); 
     } 

     private void OnExit(object sender, EventArgs e) 
     { 
      Application.Exit(); 
     } 

     protected override void Dispose(bool isDisposing) 
     { 
      if (isDisposing) 
      { 
       trayIcon.Dispose(); 
      } 

      base.Dispose(isDisposing); 
     } 

     private void MyApps(object sender, EventArgs e) 
     { 
      String currentUser = Environment.UserName.ToString(); 

      string[] directories = Directory.GetDirectories(@"C:\Users\" + currentUser + @"\desktop\My Applications"); 
      foreach (string dir in directories) 
      { 
       string[] subdir = Directory.GetDirectories(dir); 
       this.trayMenu.MenuItems.Add(dir); 
       foreach (string sub in subdir) 
       { 
        (trayMenu.MenuItems[trayMenu.MenuItems.Count - 1] as MenuItem).DropDownItems.Add(sub); 


       } 

       string[] files = Directory.GetFiles(dir); 
       foreach (string file in files) 
       { 
        this.trayMenu.MenuItems.Add(file); 
       } 
      } 
     } 


    } 
} 
+0

wollen es nicht eine sehr schwierige Aufgabe sein. Sie müssen die Unterordner mit 'Directory.GetDirectories' auflisten und das Kontextmenü mit diesen Informationen erzeugen. Aber ich habe es nicht versucht, wenn Sie haben und irgendein spezifisches Problem haben, stellen Sie eine andere Frage darüber – Pikoh

+0

Ist das wahrscheinlich, nur eine Liste des Inhalts des gewünschten Verzeichnisses zu bevölkern, verglichen mit einer Abkürzung zu den Akten, die sein können Einzelklick, um die einzelnen Dateien direkt aus der Liste zu starten? – gunstarone

Antwort

0

Dies ist ein einfacher Schnelltest die ich gemacht habe, ein einfaches Context verwenden. Es sollte natürlich rekursiv sein, aber nur Sie auf die Spur zu kommen:

string[] directories = Directory.GetDirectories(@"D:\descargas"); 
foreach (string dir in directories) 
{ 
    string[] subdir = Directory.GetDirectories(dir); 
    this.contextMenuStrip1.Items.Add(dir); 
    foreach(string sub in subdir) 
    { 
      (contextMenuStrip1.Items[contextMenuStrip1.Items.Count-1] as ToolStripMenuItem).DropDownItems.Add(sub); 
    } 

    string[] files = Directory.GetFiles(dir); 
    foreach(string file in files) 
    { 
      this.contextMenuStrip1.Items.Add(file); 
    } 
} 

bearbeiten

Wie Sie ContextMenu verwenden und Ihre bereitgestellten Code verwenden, sollten Sie etwas tun:

private void MyApps(object sender, EventArgs e) 
    { 
     String currentUser = Environment.UserName.ToString(); 

     string[] directories = Directory.GetDirectories(@"C:\Users\" + currentUser + @"\desktop\My Applications"); 
     foreach (string dir in directories) 
     { 
      string[] subdir = Directory.GetDirectories(dir); 
      MenuItem mi=new MenuItem(dir); 
      foreach (string sub in subdir) 
      { 
       mi.MenuItems.Add(sub); 


      } 


      string[] files = Directory.GetFiles(dir); 
      foreach (string file in files) 
      { 
       mi.MenuItems.Add(file); 
      } 
      this.trayMenu.MenuItems.Add(mi); 
     } 
    } 

ich es nicht getestet, aber ich denke, das ist mehr oder weniger tun würde, was Sie

+0

Vielen Dank für das Beispiel. Ich denke, dass ich ein Include vermisse; Was ist die Deklaration, die DropDownItems enthalten würde – gunstarone

+0

@gunstarone Ich denke, dass Sie ContextMenu verwenden. In meinem Beispiel verwende ich ** ContextMenuStrip **. Deshalb haben Sie nicht DropDownItems – Pikoh

+0

@gunstarone sehen meine aktualisierte Antwort – Pikoh

Verwandte Themen