.net 从资源管理器以多个文件作为参数打开程序一次

.net 从资源管理器以多个文件作为参数打开程序一次,.net,vb.net,explorer,contextmenu,single-instance,.net,Vb.net,Explorer,Contextmenu,Single Instance,我有一个程序,当使用资源管理器中的右键单击菜单打开文件时可以运行。但是,如果我选择多个文件,然后右键单击并使用我的程序打开,那么它将打开我程序的多个实例,而不是将多个文件作为参数传递给单个实例。该程序是用vb.net编写的,但不是windows窗体,它只是一个模块,因此我可以在Visual Studio的属性中勾选“单实例”选项 因此,如何在一个实例中从资源管理器上下文菜单打开多个文件。这里没有令人满意的答案,Windows资源管理器无法提供一种启动程序并传递所有选定文件的简单方法。这需要一个简

我有一个程序,当使用资源管理器中的右键单击菜单打开文件时可以运行。但是,如果我选择多个文件,然后右键单击并使用我的程序打开,那么它将打开我程序的多个实例,而不是将多个文件作为参数传递给单个实例。该程序是用vb.net编写的,但不是windows窗体,它只是一个模块,因此我可以在Visual Studio的属性中勾选“单实例”选项


因此,如何在一个实例中从资源管理器上下文菜单打开多个文件。

这里没有令人满意的答案,Windows资源管理器无法提供一种启动程序并传递所有选定文件的简单方法。这需要一个简单的过程,它们很难用托管代码编写。无法安全地编写.NET4.0之前的版本


尽管如此,使用VB.NET中可用的应用程序框架来模拟它还是很容易的,可以将您的应用程序设置为单例并实现。唯一的问题是,这并不是特别快。而且它在控制台模式的应用程序中不起作用。

虽然我知道这是针对vb.net的,但我相信您只需稍作修改就可以使用此c代码,这对我来说很有用。也许这不是最好的方法,但对我来说,这是最简单的方法。在运行第二个副本之前,它会检查应用程序标题当前是否正在运行

这在Program.cs中

 static frmMain Form;

    [STAThread]
    static void Main(string[] args)
    {
        bool blnCurrentlyRunning = false;

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        Process[] processes = Process.GetProcesses();
        foreach (var item in processes)
        {
            if (item.MainWindowTitle.IndexOf("Application Title") != -1)
                blnCurrentlyRunning = true;
        }

        if (!blnCurrentlyRunning)
        {
            Form = new frmMain();
            Application.Run(Form);
        }
        else
        {
            Application.Exit();
        }
    }

通过单击上下文菜单项,此链接帮助我获取资源管理器中选定文件的路径:

它是用C语言编写的,但正如那篇文章所说,它也可以在vb.net中使用

非常简单:

希望这对你也有帮助!:

以下是步骤:

1下载SharpShell库>>

下载文章顶部的“SharpShell Library”zip文件,并添加对下载的SharpShell.dll文件的引用

或者您可以通过Nuget下载:

如果您已经安装了Nuget,只需快速搜索SharpShell并直接安装即可-或者在获取软件包详细信息

添加以下参考:

System.Windows.Forms
System.Drawing
在代码顶部使用以下命令:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SharpShell;
using SharpShell.SharpContextMenu;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
using SharpShell.Attributes;
从SharpContextMenu派生类 右键单击该行的SharpContextMenu部分,然后选择ImplementAbstractClass

CanShowMenu

调用此函数以确定是否应显示给定文件集的上下文菜单扩展名。用户选择的文件位于SelectEdits属性中。我们可以检查这些文件路径,看看是否确实要显示菜单。如果应显示菜单,则返回true。如果不是,则返回false

创建菜单

调用此函数以实际创建上下文菜单。我们只需要返回一个标准的WinForms ContextMenuStrip

以下是整个命名空间源代码:

namespace CountLinesExtension
{
[ComVisible(true)]
[COMServerAssociation(AssociationType.ClassOfExtension, ".txt")]
public class Class1 : SharpContextMenu
{
protected override bool CanShowMenu()
{
        //  We will always show the menu.
        return true;
        //throw new NotImplementedException();
    }

    protected override ContextMenuStrip CreateMenu()
    {
        //  Create the menu strip.
        var menu = new ContextMenuStrip();

        //  Create a 'count lines' item.
        var itemCountLines = new ToolStripMenuItem
        {
            Text = "Count Lines"
        };

        //  When we click, we'll call the 'CountLines' function.
        itemCountLines.Click += (sender, args) => CountLines();

        //  Add the item to the context menu.
        menu.Items.Add(itemCountLines);

        //  Return the menu.
        return menu;
        //throw new NotImplementedException();
    }
    private void CountLines()
    {
        //  Builder for the output.
        var builder = new StringBuilder();

        //  Go through each file.
        foreach (var filePath in SelectedItemPaths)
        {
            //  Count the lines.
            builder.AppendLine(string.Format("{0} - {1} Lines",
              Path.GetFileName(filePath), File.ReadAllLines(filePath).Length));
        }

        //  Show the ouput.
        MessageBox.Show(builder.ToString());
    } 

}
}
接下来,我们必须给程序集起一个强名称。围绕这一要求有很多方法,但通常这是最好的方法。为此,右键单击项目并选择“属性”。然后转到“签名”。选择“为程序集签名”,为密钥指定“新建”,然后选择密钥名称。如果需要,可以对密钥进行密码保护,但这不是必需的

现在安装并注册外壳扩展: 帝王主义工具

您可以使用工具“regasm”安装和注册shell扩展。使用regasm时,外壳扩展将安装到注册表中,即COM服务器的类ID将放在COM服务器类部分,并与实际服务器文件的路径相关联,它还将注册关联

服务器管理器工具

服务器管理器工具是我安装/卸载和注册/注销的首选方法,至少在开发期间是这样,因为它允许您作为单独的步骤进行安装和注册。它还允许您指定是以32位还是64位模式安装/卸载etc

这是整个示例源代码。我们可以添加任意数量的上下文菜单项、任意函数、任意文件扩展名等