说明: 我不记得Linux和我不了解OS X,但在Windows中你可以右键单击一个文件并选择一个程序来打开它。但操作系统如何知道如何使程序打开呢?它是否跟踪程序的“打开文件”对话框?开发人员是否必须为这些情况指定特殊的事件处理程序或其他东西?
答案 0 :(得分:3)
对于Windows,答案在注册表中。如果您习惯阅读注册表,请在Windows计算机上运行regedit.exe。
在HKEY_CLASSES_ROOT下,您将看到所有文件类型的密钥列表,.doc,.txt等。这些密钥中的每一个都包含一个名为“OpenWithList”或“OpenWithProgIds”的密钥。应用程序可能有一个注册的“ProgId”,也可以在HKEY_CLASSES_ROOT下找到,它可以将它的ProgId注册到它想要在OpenWithProgIds中处理的文件类型。否则它会在OpenWithList中注册自己。
回应对第一个答案的评论(因为我没有足够的代表评论):
您正在考虑使用DDE,这是一种近乎被弃用的技术。 Windows shell使用所选文件作为第一个参数执行应用程序。
答案 1 :(得分:1)
Windows资源管理器会根据以下键中的文件扩展名记住您之前的“打开方式...”选项:
HKCR\.ext\OpenWithList
下次右键单击该文件时,它会查看该文件,并构建一个以前用于打开特定文件类型的程序列表。
说它找到一个名为“myapp.exe”的密钥。然后它在这里查找应用程序:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Applications\myapp.exe
获取安装应用程序的信息。它就在这里:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\AppID\myapp.exe
跟随存储在那里的GUID,找出应用程序的显示名称。
为了增加乐趣,主要关联的应用程序也在列表中,也包括OpenWithProgIds
键中的所有内容以及所有内容:
HKEY_CLASSES_ROOT\*\OpenWithList
以及各自的HKEY_CURRENT_USER
对应方。
然后,生成的应用程序列表将变为唯一,排序和显示。在选择时,文件的启动方式与您点击的任何其他文件一样 - 即:
C:\path\to\myapp.exe "C:\path\to\the\file.ext"
答案 2 :(得分:0)
答案 3 :(得分:0)
文件关联存储在注册表中:HKEY_CLASSES_ROOT。
您可以使用Windows资源管理器以图形方式管理它们:(WinXP)
单击工具/选项/文件类型
或使用“控制面板”中的“默认程序”小程序。 (Vista)的
答案 4 :(得分:0)
只是为了一些怀旧,相当辉煌的Acorn archimedes有一个更好的系统,每个文件类型都有一个唯一的类型号,带有制造商和应用程序代码(更像是MAC地址),这是用文件写的。
这意味着您可以使用正确的应用程序打开所有名为.bak的不同文件 - 与Windows安装的应用程序窃取该类型的每个现有文件的所有权的情况不同。 Autocad特别不好,注册了大约20种文件类型。
答案 5 :(得分:-1)
操作系统运行指定的程序作为参数发送要打开的文件的路径。
例如,在C#中,如果您想知道操作系统希望您打开哪个文件,则需要执行以下操作:
class Program
{
static void Main(string[] args)
{
if (args.Length == 1) //The OS wants me to open a file
openSomeFileJustBecauseTheOSWantsIt(args[0]);
}
}