C# 枚举文件夹/子文件夹内容,右键单击C中系统托盘应用程序的上下文菜单#
我正在使用中的模板创建一个具有右键单击上下文菜单的系统托盘图标 我可以让其中一个按钮启动一个资源管理器进程,该进程使用此函数打开到目录的根目录C# 枚举文件夹/子文件夹内容,右键单击C中系统托盘应用程序的上下文菜单#,c#,icons,directory,system,tray,C#,Icons,Directory,System,Tray,我正在使用中的模板创建一个具有右键单击上下文菜单的系统托盘图标 我可以让其中一个按钮启动一个资源管理器进程,该进程使用此函数打开到目录的根目录 private void MyApps(object sender, EventArgs e) { String currentUser = Environment.UserName.ToString(); Process explorer = new Process(); explorer
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();
}
我更愿意做的是,单击系统托盘图标按钮时,将其展开为包含所需目录内容的子菜单,该目录本身包含可浏览的子文件夹。想象一下(Windows 8之前版本)的开始菜单中有嵌套的菜单和应用程序;这就是我想模仿的行为
到目前为止,我发现人们编写了多个项目来创建自己的自定义Windows Explorer外壳,但实际上,为了将所需文件夹的内容动态枚举到系统托盘图标的右键单击上下文菜单中,是否需要执行这些项目
在.NET应用程序中使用VisualStudio表单要舒服得多,但从我所读到的内容来看,在启动时无法真正“隐藏”表单,所以现在我使用的是C#
如有任何意见或建议,将不胜感激。谢谢
编辑:下面是更新的代码,其中包含使用指定目录的内容递归填充菜单项的建议方法。我现在得到一个错误,“System.Windows.Forms.MenuItem”不包含下拉项的定义
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);
}
}
}
}
}
这是我用一个简单的ContextMenuStrip做的一个简单的快速测试。它当然应该是递归的,但只是为了让您走上正轨:
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);
}
}
编辑
当您使用ContextMenu并使用提供的代码时,您应该执行以下操作:
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);
}
}
我还没有测试过它,但我认为这或多或少会满足您的需求这是我使用简单的ContextMenuStrip进行的一个简单快速测试。它当然应该是递归的,但只是为了让您走上正轨:
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);
}
}
编辑
当您使用ContextMenu并使用提供的代码时,您应该执行以下操作:
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);
}
}
我还没有测试过它,但我认为这或多或少会满足您的需求这似乎不是一项非常困难的任务。您必须使用
Directory.GetDirectories
枚举子文件夹,并使用该信息生成上下文菜单。但是我还没有尝试过,如果你有并且有任何具体的问题,可以问另一个问题,它可能只填充所需目录的内容列表,而不是作为文件的快捷方式,可以通过单击直接从列表中启动单个文件?这似乎不是一项非常困难的任务。您必须使用Directory.GetDirectories
枚举子文件夹,并使用该信息生成上下文菜单。但是我没有尝试过,如果你有并且有任何具体的问题,请问另一个问题,关于它可能只填充所需目录的内容列表,而不是作为文件的快捷方式,可以单击以直接从列表中启动单个文件?非常感谢你的示例。我想我错过了一个包含;该宣言将包括哪些内容DropDownItems@gunstarone我想您正在使用ContextMenu。在我的示例中,我使用的是ContextMenuStrip。这就是为什么您没有DropDownItems
非常感谢您的示例。我想我错过了一个包含;该宣言将包括哪些内容DropDownItems@gunstarone我想您正在使用ContextMenu。在我的示例中,我使用的是ContextMenuStrip。这就是为什么您没有DropDownItems