如何从Registry / LocalMachine / Software / Classes / .docx / shell / Open / Command中的默认值获取应用程序名称

时间:2014-12-03 03:06:03

标签: c# windows registry

我需要知道从Registry / LocalMachine / Software / Classes / .docx / shell / Open / Command获取应用程序名称的最有效方法。例如来自这个

“C:\ Program Files(x86)\ Microsoft Office \ Office15 \ POWERPNT.EXE”“%1”/ ou“%u”

我只需要'POWERPNT.EXE'。 substring和replace无效,因为inside里面的值不同。例如

“C:\ Program Files(x86)\ Microsoft Office \ Office15 \ EXCEL.EXE”/ dde ​​

“C:\ Program Files(x86)\ Skype \ Phone \ Skype.exe”“/ uri:%l”

我在这里遇到的真正问题是我正在检索的字符串可能包含命令行参数以及可执行文件的路径,substring和replace将不再有用。

我的方法的目的是找出用于打开关联文件类型的程序,然后使用Process.Start(“EXCEL.EXE”,fileURL)从SharePoint DocumentLibrary打开文件

3 个答案:

答案 0 :(得分:1)

这样的事情会起作用吗?

public static string GetFileName(string input)
{
    int extensionIndex = input.IndexOf(".exe", StringComparison.OrdinalIgnoreCase);
    if (extensionIndex < 0) return string.Empty;
    return Path.GetFileName(input.Replace("\"", "").Substring(0, extensionIndex + 4));
}

// Or, if you want to get the full path:
public static string GetFilePath(string input)
{
    int extensionIndex = input.IndexOf(".exe", StringComparison.OrdinalIgnoreCase);
    if (extensionIndex < 0) return string.Empty;
    return input.Replace("\"", "").Substring(0, extensionIndex + 4);
}

用法:

string regValue =
    "C:\\Program Files (x86)\\Microsoft Office\\Office15\\EXCEL.EXE /dde";

Console.WriteLine(GetFileName(regValue));
Console.WriteLine(GetFilePath(regValue));
// Output:
// EXCEL.EXE
// C:\Program Files (x86)\Microsoft Office\Office15\EXCEL.EXE

regValue = "\"C:\\Program Files (x86)\\Skype\\Phone\\Skype.exe\" \"/uri:%l\"";

Console.WriteLine(GetFileName(regValue));
Console.WriteLine(GetFilePath(regValue));
// Output:
// Skype.exe
// C:\Program Files (x86)\Skype\Phone\Skype.exe

答案 1 :(得分:0)

几乎在所有情况下,CommandLineToArgvW都应该很好用。它返回一个字符串数组,其中第一个元素是可执行文件的路径。

然后您需要做的就是删除引号(如果有的话)以及最后一个反斜杠的所有内容。

可能(或可能不)是病态案例,其中此函数不像Explorer那样解释字符串。除了通过实验,我认为没有办法确定这一点。

答案 2 :(得分:0)

对初始问题的评论澄清了实际问题。

  

我的方法的目的是找出正在使用的程序   打开关联的文件类型,然后使用   Process.Start(“EXCEL.EXE”,fileURL)打开文件

如果只需要在关联的应用程序中打开给定文件,则无需读取注册表或解析命令行。

您可以通过调用带有一个参数的Process.Start的不同重载来打开文件。

Process.Start(fileURL);

根据MSDN:http://msdn.microsoft.com/en-us/library/53ezey2s(v=vs.110).aspx,参数是要在此过程中运行的文档或应用程序文件的名称。

我测试了本地文件,例如“C:\ folder \ test.txt”和URL。

Process.Start(@"C:\folder\test.txt"); // Opens test.txt in Notepad

Process.Start("http://regmagik.com/index.htm"); // Opens web page in the browser