Scr*_*uck 4 windows file-association
我有文件关联问题。我的 C# 应用程序可以为其自己的扩展设置文件关联,以便用户双击它使用的项目文件将打开我的应用程序并加载文件。
这会导致两个第三方组件出现问题。每次使用许可。
使用双击时,会出现两个组件的许可证对话框。从可执行文件运行应用程序时,不会发生这种情况。如果我将适当的文件拖到我的应用程序快捷方式上,应用程序将从该文件开始,并且不会出现许可证对话框。
因此我必须得出结论,问题在于 Windows 执行文件关联操作的方式。
创建许可证代码的人告诉我,问题很可能是可执行文件名称已更改,而许可证代码拒绝了它。我只能假设这与包含文件名的参数有关。
我试图通过代码中的断点捕获代码执行,但即使断点位于执行的第一行,我也无法实现。无论 Windows 做什么,都超过了那个点。
当您在 Windows 资源管理器中双击某个文件时,Windows 外壳会在注册表中查找该文件的扩展名,以查看该扩展名是否已注册。如果未注册扩展名,Windows 将显示打开方式对话框,允许用户选择与文件类型关联的应用程序。如果已注册扩展,Windows 将使用“打开”命令调用 ShellExecute() 函数。它还将被双击的文件的名称作为命令行参数传递。
但是,关联不仅仅是打开文件。如果在资源管理器中右键单击文本文件 (.TXT),您将在上下文菜单顶部看到两个项目。第一个名为 Open。选择此菜单项与在资源管理器中双击文件相同。当您选择打开时,NOTEPAD.EXE 将启动并加载选定的文件(假设默认安装 Windows)。第二个菜单项称为打印。单击此菜单项将导致打印文件而根本不显示记事本。
其他文件类型在资源管理器的上下文菜单中显示更多项目。例如,如果右键单击 Microsoft PowerPoint 文件,您将看到名为“打开”、“新建”、“打印”和“显示”的上下文菜单项。特定文件类型的上下文菜单上显示的项目是从注册表中获取的。
在 Windows 中至少有两种方法可以创建文件关联。一种方法是在 Windows 资源管理器中右键单击文件,然后从上下文菜单中选择打开方式...。执行此操作后,Windows 将显示“打开方式”对话框。自然,这种方法需要用户干预。部署应用程序时,您可能不想强迫用户手动设置文件关联。
创建关联的更好方法是从您的应用程序中创建各种注册表项。一个好的安装程序会为您创建注册表项,但有时您需要对过程进行更多控制。
注册协会
注册文件关联需要创建两个单独的注册表项。这两个键都是在HKEY_CLASSES_ROOT注册表部分中创建的。
文件扩展键
第一个键是文件扩展名,前面有一个点。
HKEY_CLASSES_ROOT\.zzy
在生产应用程序中,您应该在尝试创建新密钥之前检查注册表以确保密钥不存在。如果密钥已经存在,您的应用程序将需要提示用户替换文件关联,或者准备好完全使用不同的文件扩展名。
此键的值与您将创建的第二个键相关联。实际上,它是第二个键的名称。对于示例程序,我为该键指定了“Test App File”值。此值可以是您选择的任何值,但与第一个键一样,您必须确保注册表中不存在该键。
应用关联键
第二个键的名称与第一个键的默认值相同。
HKEY_CLASSES_ROOT\Test App File
这个键必须至少有一个子键。Windows 在执行应用程序时使用此子项。整个密钥的结构如下:
HKEY_CLASSES_ROOT
Test App File
shell
open
command
Run Code Online (Sandbox Code Playgroud)
提供给命令键的字符串是应用程序的完整路径和文件名,后跟%1。例如:
C:\MyApp\MyApp.exe %1
当 Windows 启动应用程序时,它会将%1符号替换为在 Windows 资源管理器中双击的文件的路径和文件名。该值作为命令行参数传递给您的应用程序。
附加键
您可以在文件关联键下创建其他子键。一把这样的钥匙就是DefaultIcon钥匙。此键用于指定 Windows shell 将在已注册类型的文件旁边显示的图标。如果您只注册了一种文件类型并且该文件类型应使用应用程序图标,则不需要此键。以下是 DefaultIcon 键的值如何查找指定默认应用程序图标的关联:
C:\MyApp\MyApp.exe,0
这指定应用程序的 EXE 文件中找到的第一个图标应用作文件关联的显示图标。如果您的应用程序有多个文件类型,您可以通过更改逗号后面的图标索引来指定其他图标。例如,C++Builder 具有项目文件、表单文件、源文件等的图标。如果您查看下面的注册表,HKEY_CLASSES_ROOT\BCBProject\DefaultIcon您将看到项目文件的图标是图标索引 4(至少对于 C++Builder 4)。
如果要允许用户打印文档,除了打开子项之外,还可以添加打印子项。打印子键的值类似于打开子键的值,但有一个例外:
C:\MyApp\MyApp.exe /p %1
请注意,该值在应用程序名称和%1符号之间插入了一个命令行开关/p。您的应用程序可以监视/p开关并在检测到该开关时采取适当的措施。
您可以为特定文件类型添加任意数量的子项。每个子项的名称将出现在资源管理器上下文菜单上。您只需为每个命令类型添加一个命令行开关,以便您的应用程序可以识别所选的上下文菜单项。如果您为子项提供默认值,Windows 将使用该文本作为上下文菜单项文本。如果您不提供默认值,Windows 将使用键名本身作为菜单项。
所有信息均来自本文。
| 归档时间: |
|
| 查看次数: |
2336 次 |
| 最近记录: |