使用鼠标右键获取多个文件路径
本文关键字:文件 路径 获取 鼠标 右键 | 更新日期: 2023-09-27 18:28:29
我已经在注册表的帮助下将我的应用程序添加到Windows的右键菜单中
"C://myapp.exe"%1"
我可以使用下面的代码在MessageBox
中获得所选文件的路径。
static void Main(string[] args)
{
foreach (string path in args)
{
MessageBox.Show(path);
}
}
如果我想打开一个文件,这是可以的,但如果我选择多个文件,它会运行我的应用程序的多个实例。我只需要单个实例中所有选定文件的路径。有人能告诉我怎么做吗?
一个非编程解决方案,可以同时复制所有路径,如下所示(在Windows 7上测试):
- 选择所需的文件
- 按住Shift键并单击鼠标右键
- 单击"复制为路径"(它显示为一个附加选项!)
所有路径都按预期复制!
我试过了,应用程序正在为每个选定的文件运行一个新实例。我甚至试图将"%2"、"%3"等添加到注册表命令中,但也没有成功。
如果真的有必要为所有文件运行一个实例,也许你可以将你的应用程序设置为使用从WindowsFormsApplicationBase派生的类,设置IsSingleInstance属性并覆盖OnStartupNextInstance(没有链接,因为我的声誉不允许超过2个链接)
虽然它要复杂得多,但我知道Shell扩展处理程序可以解决这个问题
如何用.NET语言编写Windows Shell扩展
我为一个windows窗体应用程序编写了其中一个,当用户右键单击特定的文件类型时,该应用程序就会打开。它也适用于多个文件。
祝你好运!
首先,我想告诉您的方法最重要的一点是,使用注册表中的右键单击快捷方式绝对不可能获得多个文件路径。然而,在这种方法上有一些变通办法可能会有所帮助;
- 如果你真的需要这个简单的方法,那么你就必须使用Mutex Class来处理应用程序实例。如果你成功地使用Mutex将应用程序实例限制为单个,这可能会为你提供一些帮助。要让这个方法为你工作,你必须将命令行参数从以前的所有实例传递到最后一个实例
我刚才解释的方法涉及到在启动过程中获取所有文件路径的大量代码,然而第二种方法easy最适合这种情况,但它有点困难,需要的不仅仅是可执行文件。
- 正如我所说,第二种(推荐的)方法有点棘手,因为它涉及到在应用程序中创建一个额外的组件来获取所有文件路径,但它确保您一次性接收所有路径(没有多个实例)。第二种方法的标题可能是Shell Extensions为了解释这种方法,让我解释一下一些先决条件(如果你已经知道的话,请不要犹豫,跳过它们)。外壳扩展是COM服务器,它们在用户的计算机上注册,带有一些特定类型的文件,它们可以处理,比如.cs,.csproj(默认情况下,两者都注册为使用Visual Studio打开)。Shell扩展也称为上下文菜单处理程序。注册的Shell扩展或上下文菜单处理一旦注册要打开的文件扩展名从Windows资源管理器的上下文菜单收到右键单击,就会被调用
一般来说,shell扩展或上下文菜单处理程序是一个注册的COM服务器,它以动态链接库的形式存在于用户的计算机中,如果注册的文件类型收到右键单击选择或双击,就会调用它的函数
有了这些,我想你已经有足够的东西来为Shell Extensions做一个良好的开端了。下面是一篇很好的循序渐进的文章,为你提供一个不错的起点
我想这将帮助你实现你的需求。如果还有什么,请告诉我。
您的应用程序很可能没有运行其自身的多个实例,您只是得到了多个消息框,因为您告诉foreach循环显示每个路径的消息框。您需要操作一个字符串以包含所有路径,然后将它们插入到消息框中进行显示。
来自
static void Main(string[] args)
{
foreach (string path in args)
{
MessageBox.Show(path);
}
}
至
static void Main(string[] args)
{
string paths = "";
foreach (string path in args)
{
paths += path + Environment.NewLine;
}
MessageBox.Show(path);
}