c# - 如何从可以处理特定文件扩展名的程序列表中启动进程?

标签 c# process registry

我正在编写一个程序,其中包含各种格式(.png、.jpg、.bmp、.ico...)的图像列表,到目前为止,我已经能够获得 shell 命令列表与每个文件相关联,如下所示:

"\"C:\\Program Files\\Paint.NET\\PaintDotNet.exe\" \"%1\""
"\"C:\\Program Files\\GIMP 2\\bin\\gimp-2.8.exe\" \"%1\""
"C:\\Windows\\System32\\rundll32.exe \"C:\\Program Files (x86)\\Windows Photo Viewer\\PhotoViewer.dll\", ImageView_Fullscreen %1"
"\"C:\\Windows\\system32\\mspaint.exe\" /pt \"%1\" \"%2\" \"%3\" \"%4\""    
"\"C:\\Program Files (x86)\\PDFCreator\\pdfcreator.exe\" -IF\"%1\"" string

我不确定这是正确的,但这是我目前所拥有的。使用时:

Process.Start(completeProgramPath);

程序永远找不到,除非我使用类似的东西

Process.Start("mspaint.exe");

我希望能够指定操作系统应该使用哪个程序。我究竟做错了什么?是我的程序列表没有指向正确的东西,还是我没有使用 Process.Start();正确吗?

最佳答案

如果要为每个图像打开默认程序,则只需将文件名作为唯一参数提供给 Process.Start 方法,省略可执行路径,操作系统将查找在注册表中,这样您就不必:

Process.Start("C:\some\picture.jpg");

这将打开 *.jpg 扩展名的默认程序,并将文件路径作为参数传递给它。

如果要指定程序,则应使用 Process.Start(string, string) 重载,其中将可执行文件的路径指定为第一个参数,并将文件作为第二个参数。

如果您尝试使用注册表项中的确切值,它将不起作用,因为它们将 "%1" 添加到路径中,并且 rundll32 项具有其他参数。关键是在将它们传递给 Start 方法之前,您必须更改从注册表项中获取的字符串。

示例:
"\"C:\\Program Files\\Paint.NET\\PaintDotNet.exe\"\"%1\"" 需要变成:
“C:\Program Files\Paint.NET\PaintDotNet.exe”

关于c# - 如何从可以处理特定文件扩展名的程序列表中启动进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15394295/

相关文章:

c# - XmlSerializer 不可靠还是我做错了什么?

c# - 更新其中一个相同型号网络适配器的驱动程序

c# - 需要简单的 linq

c# - 通过工厂问题和注意事项涉及实体创建的单元测试类

子进程内存分配及收割子进程的目的

internet-explorer - 如何通过注册表启用 ActiveX 插件? (IE8、Windows 7)

.net - .NET 的 NewRelic 需要在注册表中将 COR_ENABLE_PROFILING 设置为 1

windows - 通过批处理语法查询Windows注册表

process - 准备用于流程挖掘的 csv 文件

process - 当 CPU 分配给用户进程时,谁在操作系统中运行调度程序?