我正在使用C#开发一个面向.NET Framework 2.0的应用程序,我需要能够找到用于打开特定文件类型的默认应用程序.
我知道,例如,如果您只想使用该应用程序打开文件,您可以使用以下内容:
System.Diagnostics.Process.Start( "C:\...\...\myfile.html" );
Run Code Online (Sandbox Code Playgroud)
在默认浏览器中打开HTML文档,或
System.Diagnostics.Process.Start( "C:\...\...\myfile.txt" );
Run Code Online (Sandbox Code Playgroud)
在默认文本编辑器中打开文本文件.
但是,我希望能够在默认文本编辑器中打开不一定具有.txt扩展名的文件(例如),因此我需要能够找到打开的默认应用程序. txt文件,这将允许我直接调用它.
我猜测有一些Win32 API,我需要P/Invoke才能做到这一点,但是对谷歌和MSDN的快速浏览并没有发现任何有趣的东西; 我确实找到了大量完全不相关的页面,但没有像我在寻找的那样.
如果我有一个VS 2005解决方案,那么它会显示为"Version:Visual Studio 2005".如果我有一个VS 2010解决方案,则sln文件显示为与此相关.
它们都有.sln后缀.那么Windows如何知道用哪个版本的VS打开它呢?
我需要获取当前与当前用户的文件扩展名相关联的程序的名称.如果右键单击文件并选择属性,那么我需要的是"打开方式"行右侧的程序名称.
例如,对于".xls",我希望能够得到答案"Microsoft Office Excel",或者用户拥有的任何程序作为打开.xls文件的默认程序.
我已经确定它并不像进入HKEY_CLASSES_ROOT并选择它那么容易,因为它也可以在HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER或HKEY_USERS中指定.
也许我需要知道的是Windows用来确定这个以及如何到达每个位置的啄食顺序.当然,执行此操作的Windows API调用将是理想的.
这是一个类似的问题: 如何使用Delphi从文件扩展名获取图标和描述?但是这个问题只回答了如何获得扩展的描述和相关程序的图标.我找不到扩展它的方法来获取相关程序的名称.
我正在使用Delphi 2009,需要一个适用于Windows XP,Vista和7的解决方案.
谢谢大家的答案.
我认为可执行文件的名称毕竟不在注册表中.在广泛浏览了将提供名称的Windows API之后,我找不到一个.
我认为Mef的答案是最好的.从程序可执行文件中包含的信息中获取可执行文件的名称.
我正在尝试创建一个在默认图像查看器中打开图像的简短方法,并在time几毫秒后关闭它.
现在它看起来像这样:
public static async void OpenImage(string path, int time)
{
var process = new Process();
process.StartInfo.FileName = path;
process.Start();
await Task.Delay(time);
process.Kill()
process.Close()
}
Run Code Online (Sandbox Code Playgroud)
我可以看到图像,但随后process.Kill()抛出InvalidOperationException"没有进程与此对象相关联".
我错过了什么或者还有其他办法吗?
更新:
现在也测试了这个:
public static async void OpenImage(string path, int time)
{
var process = Process.Start(path)
await Task.Delay(time);
process.Kill()
process.Close()
}
Run Code Online (Sandbox Code Playgroud)
但后来Process.Start()回归null.所以也许我必须.exe直接打电话给faljbour评论?