![](/img/trans.png)
[英]Associated extension doesn't send file name to application on double click
[英]Is an Application Associated With a Given Extension?
有时希望您的应用程序打开文件的默认应用程序。 例如,要打开PDF文件,您可以使用:
System.Diagnostics.Process.Start("Filename.pdf");
要打开图像,只需使用相同的代码,但使用不同的文件名:
System.Diagnostics.Process.Start("Filename.gif");
某些扩展名(例如.gif)几乎总是具有默认处理程序,即使在基本Windows安装中也是如此。 但是,某些扩展名(例如.pdf)通常没有安装用于处理它们的应用程序。
在这些情况下,最好在调用Process.Start(fileName)之前确定应用程序是否与您要打开的文件的扩展名相关联。
我想知道您如何最好地实现这样的事情:
static bool ApplicationAssociated(string extension)
{
var extensionHasAssociatedApplication = false;
var condition = // Determine if there is an application installed that is associated with the provided file extension.;
if (condition)
{
extensionHasAssociatedApplication = true;
}
return extensionHasAssociatedApplication;
}
由于您需要检测关联,因此我建议遵循David's Answer BUT中的建议:
要检查文件是否具有关联,可以使用本机函数FindExecutable
,这基本上是Windows资源管理器内部使用的功能...如果没有关联,它将给出一个不错的错误代码( SE_ERR_NOASSOC
)。 成功后,它会提供到相应可执行文件的路径。
您的DllImport
是
[DllImport("shell32.dll")]
static extern int FindExecutable(string lpFile, string lpDirectory, [Out] StringBuilder lpResult);
另一个选择是例如遍历注册表(不建议这样做,因为由于诸如woW64之类的多个字母比较复杂):
真正的关联存储在HKEY_CLASSES_ROOT\\.pdf
指向的密钥中(在我的情况下是AcroExch.Document
,因此我们签出HKEY_CLASSES_ROOT\\AcroExch.Document
。 在这里,您可以看到(并更改)将用于启动该类型文件的命令:
HKEY_CLASSES_ROOT\AcroExch.Document\shell\open\command
在这种情况下,最好的方法是尝试打开文档并检测故障。 尝试预测文件关联是否到位只会导致您重新实现Shell执行API。 由于它们已经存在,很难做到完全正确且相当不必要!
@Yahia得到了点头。 我正在发布我的后代快速解决方案,以便您可以了解我的工作。 可以对该代码进行很多可能的改进,但这将使您有一个想法:
public static bool HasExecutable(string path)
{
var executable = FindExecutable(path);
return !string.IsNullOrEmpty(executable);
}
private static string FindExecutable(string path)
{
var executable = new StringBuilder(1024);
FindExecutable(path, string.Empty, executable);
return executable.ToString();
}
[DllImport("shell32.dll", EntryPoint = "FindExecutable")]
private static extern long FindExecutable(string lpFile, string lpDirectory, StringBuilder lpResult);
您也将在注册表中查看该信息。
您可以遵循:
HKEY_CLASSES_ROOT\.extension
它通常会导致类似HKEY_CLASSES_ROOT\\extfile\\Shell\\Open\\Command
然后您将进入命令以打开文件类型。
根据您的操作,最好是请求宽恕(即,打开文件并查看)
所有这些信息都保存在注册表中。您可以导航到HKEY_CLASSES_ROOT,找到扩展名,然后从那里查找默认处理程序。 但是根据文件的类型和相关的处理程序,您需要涉足CLSID,而不是……您最好捕获一个异常。
此信息在注册表中。 例如:
# Mount the HKCR drive in powershell
ps c:\> new-psdrive hkcr registry hkey_classes_root
ps c:\> cd hkcr:\.cs
# get default key for .cs
PS hkcr:\.cs> gp . ""
(default) : VisualStudio.cs.10.0
...
# dereference the "open" verb
PS hkcr:\.cs> dir ..\VisualStudio.cs.10.0\shell\open
Hive: hkey_classes_root\VisualStudio.cs.10.0\shell\open
Name Property
---- --------
Command (default) : "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe" /dde
ddeexec (default) : Open("%1")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.