吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 529|回复: 11
收起左侧

[经验求助] 【windows相关】求大佬帮忙改一下C#的代码

[复制链接]
onlyclxy 发表于 2022-11-24 15:08
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); } ...

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

topwind 发表于 2022-11-24 15:47
已私发,请查收

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
onlyclxy + 3 + 1 非常感谢.!! 我过会儿找空再试一下

查看全部评分

Broadm 发表于 2022-11-24 15:08
我也来参与一下


修改2处即可
1. 关于带空格的路径问题,修改Item_Click即可
[C#] 纯文本查看 复制代码
            List<string> paths = SelectedItemPaths.ToList();
            paths.Add(arg);

            //因为不确定参数是否有空格,所有每个参数都加双引号
            for (int i = 0; i < paths.Count; i++)
            {
                paths[i] = string.Format("\"{0}\"", paths[i]);
            }

            string args = string.Join(Environment.NewLine, paths);
            Process.Start(appFile, args);


2. 关于菜单一级显示,修改CreateMenu为
[C#] 纯文本查看 复制代码
        protected override ContextMenuStrip CreateMenu()
        {
            //设置次级菜单
            var subItemsInfo = new Dictionary<string, string>()
            {
                { "复制完整路径", "copyPath" },
                { "合并Excel报表", "mergeExcelReport" },
                { "合并Excel工作表", "mergeExcelSheet" },
                { "转换为PDF文件...", "mergeExcelSheet" },
                { "以邮件附件发送...", "mailTo" },
                { "批量打印文档...", "batchPrint" }
            };

            var menu = new ContextMenuStrip();
            foreach (var kv in subItemsInfo)
            {
                var item = new ToolStripMenuItem(kv.Key);
                item.Click += (o, e) =>
                {
                    Item_Click(o, e, kv.Value);
                };
                menu.Items.Add(item);
            }
            return menu;
        }

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
XiaoMaBaoLi + 1 + 1 用心讨论,共获提升!
luxingyu329 + 1 + 1 虽然不懂,但是为你的热心点赞,

查看全部评分

LiuMou666 发表于 2022-11-24 23:16
本帖最后由 LiuMou666 于 2022-11-24 23:18 编辑



这个可以用注册表实现,直接添加给系统
LiuMou666 发表于 2022-11-24 23:23
LiuMou666 发表于 2022-11-24 23:16
这个可以用注册表实现,直接添加给系统

[Shell] 纯文本查看 复制代码
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\CopyAsPath]
"MUIVerb"="@shell32.dll,-30329"
"Icon"="imageres.dll,-5302"
"Position"="top"

[HKEY_CLASSES_ROOT\AllFilesystemObjects\shell\CopyAsPath\Command]
@="mshta vbscript:clipboarddata.setdata(\"text\",\"%1\")(close)"



上面代码放到记事本中,保存后改后缀,管理员双击还是什么,然后好像重启电脑就有了

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
onlyclxy + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| onlyclxy 发表于 2022-11-25 03:20
LiuMou666 发表于 2022-11-24 23:23
[mw_shl_code=shell,true]Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\AllFilesystemOb ...

非常感谢提供代码!
在此get到了一个新的知识点
不过对于此问题.这个解决方案还不足以.
这个右键这个方案困扰好久了. 主要是解决多选文件右键菜单,用单窗口获取全部路径.
因为获取单路径比较容易. 同时获取多路径. 之前问了好多地方, 方案都比较僵硬一些.
最终打算用sharpshell来解决这个问题,至少打开了一个新技术方向.
 楼主| onlyclxy 发表于 2022-11-25 03:23
Broadm 发表于 2022-11-24 15:08
我也来参与一下

其实我看见你那个坏笑的表情 ,我就知道这把稳了
 楼主| onlyclxy 发表于 2022-11-25 03:28

非常感谢大佬的代码 我试了一下 ,改菜单那个部分是特别棒的!一看就是专业人士!
但是因为还有个问题二需要解决空格的问题. 因为那个不解决.. 程序就还不能正常使用.
还是非常感谢您帮我解决这个问题!
Broadm 发表于 2022-11-25 09:10
onlyclxy 发表于 2022-11-25 03:23
其实我看见你那个坏笑的表情 ,我就知道这把稳了

必须的,自己写的代码,自己要测试通过才敢上交
LiuMou666 发表于 2022-11-25 12:32
我觉得改这个不难的应该,打个断点看下你想要的都能改,代javascript:;码大半部分都有了
快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-28 20:15

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表