我开发了一个 C# WPF 应用程序,它将向用户显示 .pdf 文件。用户可以直接加载 PDF
文件 --> 加载 --> (选择 PDF 文件) --> 打开
选择 PDF 并按打开后,该 PDF 将从应用程序内部显示。
或者他们可以打开包含单个 PDF 文件的 ZIP 文件夹,ZIP 中的 PDF 将自动从应用程序内部显示给用户
文件 --> 加载 --> (选择 ZIP 文件夹) --> 打开
选择 ZIP 后(已知 zip 的内容完全由一个 PDF 组成),按打开后,该 ZIP 内的 PDF 就会从应用程序内部显示出来(与直接打开 PDF 的方式相同)。
我现在想修改我的程序,以便它可以打开具有自定义扩展名的“文件夹”,即我想创建一个类似于 ZIP 的文件夹,其中包含一个 PDF 文件,但该文件夹的扩展名应该是我选择的,而不是.zip
,例如,这样我就可以有一个名为的压缩文件夹folder.abc
,其中包含一个 PDF xyz.pdf
。
然后,我想将扩展.abc
与我的应用程序关联起来,以便每当用户双击.abc
文件/文件夹时,我的应用程序就会自动打开它。
我不知道如何创建自定义扩展并使用它?例如,如何更改folder.zip
为folder.abc
,并让任何带有.abc
扩展名的内容在用户双击时由我的应用程序自动打开?
编辑
好的,我可以通过创建一个 .txt 文件、打开它,然后再次保存它、将其“类型”设置为All Files
,并给它一个以 结尾的名称.abc
(即 )来创建具有我自己的扩展名的自定义文件customFile.abc
,并且我可以通过右键单击它,转到“打开方式”,然后选择我自己的应用程序,将我的扩展与我的应用程序关联起来。
我也可以按照同样的方式对 ZIP 文件夹执行此操作。
但是,当我当前打开任何已赋予自定义扩展名的文件/文件夹时,它们只会打开一个空白窗口,即不会显示它们包含的 .pdf 文件 - 然后我必须使用我的应用程序窗口来打开它们。我通过选择文件 --> 打开并选择我刚刚双击打开我的应用程序窗口的文件来执行此操作,然后它会显示此文件包含的.abc
PDF ....abc
为什么当我在 Windows 资源管理器中双击它时它不会自动显示其中包含的 .pdf?
答案1
有多种方法可以做到这一点。例如,您可以使用标准注册表编辑工具来处理注册表。但是,还有一种方法可以使用命令行来影响它。由于这可能更容易实现自动化,因此这是一种很好的演示方法。由于您的问题显示了 的虚构扩展.abc
,因此我使用它。
从命令行进入命令提示符。如果您启用了 UAC,则这需要提升命令提示符的权限。
首先,创建一个文件类型。例如:
ftype zzzfile=C:\Windows\System32\Notepad.exe %%1
然后查看结果:
ftype zzzfile
reg query HKCR\zzzfile\SHELL\OPEN\COMMAND /ve
笔记:
- 创建此文件类型时,“%%1”用于转义百分号。两个百分号合并为一个。因此,当您查看结果时,它只会显示“%1”而不是“%%1”。
- 在创建文件类型时,需要指定整个可执行文件名称。如果只说“Notepad”,则无法正常工作。(“无法正常工作”是指 Windows 会询问用户如何处理扩展名。)C:\Windows\System32\ 似乎确实是可选的,但“.exe”不是。
然后,将扩展名关联到您的文件类型。同样,这会修改您的系统行为,因此如果启用了 UAC,则进入提升的命令提示符。运行:
assoc .abc=zzzfile
现在,您可以从该命令提示符或未提升的命令提示符检查结果:
assoc .abc
start filename.abc
(已在 Windows 7 x64 上测试。)
注意:在初步测试期间,我弄乱了 GUI。这导致使用相同扩展名的 FTYPE 和 ASSOC 无法正常工作。
检测问题相当简单,但修复却不容易。
我能够使用这个找到问题:
REG QUERY HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.abc /s
可悲的是,这并没有起到删除它的作用:
REG DELETE HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.abc
REG DELETE HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.abc\UserChoice /v Progid
我使用图形程序确认了问题:在 UserChoice 上打开 REGEDIT,然后编辑、“权限...”、(我的用户名)、高级、(权限选项卡)显示我有一个 DENY,键入 Special。编辑...从那里显示“设置值”有拒绝。
从命令行修复此问题的一种方法似乎是使用 NT 4 资源工具包中的 REGINI。要以这种方式解决问题,我需要找出我的 SID。
wmic USERACCOUNT 获取名称、SID(查找我的帐户。SID 以“S-”开头。)
创建一个文本文件。我决定将其命名为“fix.txt”。
知识库 254031表示第一行是“\Registry\User\”,后面跟着用户的 SID。因此文本文件将以此开头。
尽管各种 Microsoft KB 文章中都有一些示例,但语法可以短至一行,如下所示(但需要定制......)
\Registry\User\S-#-#-##-##########-##########-##########-1000\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.abc\UserChoice [1 5 7 17]
(当然,将“.abc”调整为您想要修复的任何扩展名。# 也需要替换,以便使用有效的 SID。)
然后,使用该文本文件:REGINI fix.txt
既然该键不再阻止我们进行更改,我们可以删除 UserChoice 键的 Progid 值。实际上,继续删除与此扩展相关的整个键。
REG DELETE HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.abc
然后,此注册表项不再被覆盖,因此 FTYPE 和 ASSOC 的结果将按预期生效。