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