好友
阅读权限30
听众
最后登录1970-1-1
|
260吾爱币
本帖最后由 onlyclxy 于 2022-11-25 03:40 编辑
问题完美解决 ! 这里非常感谢两位大佬提供的解决方案@topwind @Broadm
@topwind把最早把菜单的问题解决了. 但是因为他是私发我的,币也扣了不少.心疼啊. 这里把他热心改的代码贴出来,大家要是有学到东西,我觉得可以去楼下支持一波
@Broadm 大佬解决了两个问题.这个右键菜单的问题看来可以到此终结了.
附录
@topwind大佬的菜单解决方案
[C#] 纯文本查看 复制代码 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using SharpShell.SharpContextMenu;
using SharpShell.Attributes;
namespace AuroraContextMenu
{
[ComVisible(true)]
//如果按文件类型,按以下设置
//[COMServerAssociation(AssociationType.ClassOfExtension, ".xlsx", ".xls")]
//设置对全部文件和目录可用
[COMServerAssociation(AssociationType.AllFiles), COMServerAssociation(AssociationType.Directory)]
public class ArrContextMenu : SharpContextMenu
{
/// <summary>
/// 判断菜单是否需要被激活显示
/// </summary>
/// <returns></returns>
protected override bool CanShowMenu()
{
return true;
}
/// <summary>
/// 创建一个菜单,包含菜单项,设置ICON
/// </summary>
/// <returns></returns>
protected override ContextMenuStrip CreateMenu()
{
var menu = new ContextMenuStrip();
//设定菜单项显示文字
var item = new ToolStripMenuItem("Aurora右键助手");
//添加监听事件
//item.Click += Item_Click;
//设置图像及位置
item.Image = Properties.Resources.logo;
item.ImageScaling = ToolStripItemImageScaling.None;
item.ImageTransparentColor = System.Drawing.Color.White;
item.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
item.Click += Item_Click1;
//设置次级菜单
//Dictionary<string, string> subItemsInfo = new Dictionary<string, string>()
//{
// { "复制完整路径", "copyPath" },
// { "合并Excel报表", "mergeExcelReport" },
// { "合并Excel工作表", "mergeExcelSheet" },
// { "转换为PDF文件...", "mergeExcelSheet" },
// { "以邮件附件发送...", "mailTo" },
// { "批量打印文档...", "batchPrint" }
//};
//foreach (KeyValuePair<string,string> kv in subItemsInfo)
//{
// var subItem = new ToolStripMenuItem(kv.Key);
// subItem.Click += (o, e) =>
// {
// Item_Click(o, e, kv.Value);
// };
// item.DropDownItems.Add(subItem);
//}
menu.Items.Add(item);
return menu;
}
private void Item_Click1(object sender, EventArgs e)
{
string rootPath = getRootPath();
string appFile = string.Format(@"{0}\{1}", rootPath, "AuroraTools.exe");
List<string> paths = SelectedItemPaths.ToList();
string args = string.Join("@", paths);
Process.Start(appFile, args);
}
//菜单动作
private void Item_Click(object sender, EventArgs e, string arg)
{
string rootPath = getRootPath();
string appFile = string.Format(@"{0}\{1}", rootPath, "AuroraTools.exe");
if (!File.Exists(appFile))
{
MessageBox.Show(string.Format("找不到程序路径:{0}{1}", Environment.NewLine, appFile), "出错了", MessageBoxButtons.OK);
return;
}
List<string> paths = SelectedItemPaths.ToList();
paths.Add(arg);
string args = string.Join(" ", paths);
Process.Start(appFile, args);
}
//获取当前dll所在路径
private string getRootPath()
{
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
}
}
求大佬帮忙改两处C#的代码! ! 以下代码均为开源找到的, 也是个人用途, 不过因为不太清楚这种求改代码的算不算违规,如有违规请删帖,先谢过!
背景:最近需要做个Winrar那种右键菜单的效果, 找了好久的资料, 网上找到了个C#代码可以实现. 但是想着自定义一下, 因为不会C#,试了好久也没改好, 遂请专业人士来帮帮忙
背景:这个功能本身就是右键点这个菜单,会显示这个文件的路径
求修改的地方1:
需求:现在这个源码的效果,是层级菜单, 希望改一版不层叠菜单的, 就直接点一级菜单就可以显示路径的
菜单效果:点击二级菜单会显示当前文件路径
求修改的地方2:
需求:这也算个bug,就是文件路径有空格的时候, 代码会把这一条路径分成好几行. 求修复这个bug. 让有空格的代码也能正常在一行显示
带空格的路径,会分成好几行:
正常没空格的路径.选几个会显示几个路径:
主要代码如下:
需要在VS中创建一个类库项目管理NuGet程序包,搜索SharpShell,并安装
[C#] 纯文本查看 复制代码 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using SharpShell.SharpContextMenu;
using SharpShell.Attributes;
namespace AuroraContextMenu
{
[ComVisible(true)]
//如果按文件类型,按以下设置
//[COMServerAssociation(AssociationType.ClassOfExtension, ".xlsx", ".xls")]
//设置对全部文件和目录可用
[COMServerAssociation(AssociationType.AllFiles), COMServerAssociation(AssociationType.Directory)]
public class ArrContextMenu : SharpContextMenu
{
/// <summary>
/// 判断菜单是否需要被激活显示
/// </summary>
/// <returns></returns>
protected override bool CanShowMenu()
{
return true;
}
/// <summary>
/// 创建一个菜单,包含菜单项,设置ICON
/// </summary>
/// <returns></returns>
protected override ContextMenuStrip CreateMenu()
{
var menu = new ContextMenuStrip();
//设定菜单项显示文字
var item = new ToolStripMenuItem("Aurora右键助手");
//添加监听事件
//item.Click += Item_Click;
//设置图像及位置
item.Image = Properties.Resources.logo;
item.ImageScaling = ToolStripItemImageScaling.None;
item.ImageTransparentColor = System.Drawing.Color.White;
item.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
//设置次级菜单
Dictionary<string, string> subItemsInfo = new Dictionary<string, string>()
{
{ "复制完整路径", "copyPath" },
{ "合并Excel报表", "mergeExcelReport" },
{ "合并Excel工作表", "mergeExcelSheet" },
{ "转换为PDF文件...", "mergeExcelSheet" },
{ "以邮件附件发送...", "mailTo" },
{ "批量打印文档...", "batchPrint" }
};
foreach (KeyValuePair<string,string> kv in subItemsInfo)
{
var subItem = new ToolStripMenuItem(kv.Key);
subItem.Click += (o, e) =>
{
Item_Click(o, e, kv.Value);
};
item.DropDownItems.Add(subItem);
}
menu.Items.Add(item);
return menu;
}
//菜单动作
private void Item_Click(object sender, EventArgs e, string arg)
{
string rootPath = getRootPath();
string appFile = string.Format(@"{0}\{1}", rootPath, "AuroraTools.exe");
if (!File.Exists(appFile))
{
MessageBox.Show(string.Format("找不到程序路径:{0}{1}", Environment.NewLine, appFile), "出错了", MessageBoxButtons.OK);
return;
}
List<string> paths = SelectedItemPaths.ToList();
paths.Add(arg);
string args = string.Join(" ", paths);
Process.Start(appFile, args);
}
//获取当前dll所在路径
private string getRootPath()
{
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
return Path.GetDirectoryName(path);
}
}
}
原贴是这个
C#下使用SharpShell自定义桌面鼠标右键菜单,一次选择多个文件进行后续处理 - ryan1985 - 博客园 (cnblogs.com)
老外sharpshell的原贴
.NET Shell Extensions - Shell Context Menus - CodeProject
提供这个代码的源文件:
C#下使用SharpShell自定义桌面鼠标右键菜单,一次选择多个文件进行后续处理.zip - 蓝奏云 (lanzoul.com)
全部的分奉上了.再次感谢!
|
最佳答案
查看完整内容
我也来参与一下
修改2处即可
1. 关于带空格的路径问题,修改Item_Click即可
[mw_shl_code=csharp,true] List paths = SelectedItemPaths.ToList();
paths.Add(arg);
//因为不确定参数是否有空格,所有每个参数都加双引号
for (int i = 0; i < paths.Count; i++)
{
paths = string.Format("\"{0}\"", paths);
}
...
|