65.9K
CodeProject 正在变化。 阅读更多。
Home

VB.NET 文件关联

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.06/5 (38投票s)

2007 年 4 月 29 日

CDDL

4分钟阅读

viewsIcon

367188

downloadIcon

6435

只需两行 Visual Basic 代码,即可轻松将您的程序与文件类型(.jpg、.html、.mp3)相关联

Screenshot - VBFileAssociation1.gif

是否曾希望用户打开特定类型的文件时,您的应用程序也会随之启动?这可以通过编辑几个注册表项来轻松实现。

程序如何关联?

注册表存储所有文件类型与应用程序的关联。点击“开始”菜单 -> “运行” -> 输入“regedit” -> 确定。现在展开 HKEY_CLASSES_ROOT 节点。窗口顶部是您的计算机识别的所有扩展名。向下滚动到 .txt 并单击它。现在查看默认值,它可能是“txtfile”。在左侧树状图中向下滚动,找到 txtfile 节点。这包含了所有默认值设置为 txtfile 的扩展名的信息。目前,我们只关心打开文件,所以打开 Shell -> Open -> Command。如果您的 .txt 文件用记事本打开,那么默认值应为“%SystemRoot%\system32\NOTEPAD.EXE %1”。
%SystemRoot% 不言而喻,它被包含 system32 的文件夹替换,而 system32 包含了 NOTEPAD.EXE
%1 是打开 txtfile 时传递给程序的命令行参数。%1 被替换为文件的位置。

步骤 1:在打开 .hello 文件时运行您的程序

第一步是让您的应用程序在用户双击选定的扩展名(如 .mp3)时打开。在本文中,我们将使用一个不应存在的扩展名:.hello。要使用此文件类型,请创建一个名为“Hello World”的新项目。所包含的项目文章中的思想是:一个 .hello 文件包含(明文)一个形容词。打开它时,会弹出一个消息框,显示“Hello, (文件内容) World”。如果您手动打开应用程序,它将把自己与 .hello 扩展名关联起来。因此,在 .hello 文件默认被演示程序打开之前,您必须单独运行它。

现在我们需要像您在 .txt 扩展名中看到的那样编辑注册表。使用以下代码执行此操作:

My.Computer.Registry.ClassesRoot.CreateSubKey(".hello").SetValue_
	("", "Hello", Microsoft.Win32.RegistryValueKind.String)
My.Computer.Registry.ClassesRoot.CreateSubKey_
	("Hello\shell\open\command").SetValue("", Application.ExecutablePath & _
	" ""%l"" ", Microsoft.Win32.RegistryValueKind.String)

这一切都是什么意思?如果您不理解 My.Computer.Registry,这里有一个指向 MSDN 的链接,或者查看下面的内容。

代码 它的作用
CreateSubKey(".hello") .hello 扩展名的 ClassesRoot 中创建一个注册表项。请注意,您必须包含开头的句点。
.SetValue("", "Hello"...
  1. ""(或 Nothing)设置键的默认值。
  2. "Hello" 就像我们之前看到的“txtfile”,它告诉我们哪个注册表项包含有关 .hello 扩展名的信息。
CreateSubKey("Hello" & _ "\shell\open\command") 这会创建“Hello”子项和“store\open\command”子项,这些是存储将打开此文件类型的应用程序路径所必需的。
.SetValue("", Application.ExecutablePath & _ " ""%l"" ",...
  1. 同样,"" 告诉应用程序设置键的默认值。
  2. Application.ExecutablePath 告诉代码将当前正在运行的可执行文件与此文件类型关联起来。
  3. " ""%1"" " 将打开文件的位置传递给您的程序。周围的引号是可选的,但如果您有多个参数,则必须在每个参数周围都加上引号。

现在运行您的应用程序一次。它将编辑注册表。您的程序现在已与 .hello 文件关联!

现在,假设您想在程序中创建 .txt 文件的文件关联。您创建了文件关联,但它仍然在记事本中打开。怎么回事?还有一个需要删除的值位于此处:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.txt

该值名称为 'Progid'。它将是一个 string 值,指定打开此文件类型的默认程序。如果此值存在,您将无法将任何内容与此特定文件类型关联。您必须删除 'Progid' 值才能使关联生效。

感谢 Computer Masster

现在来测试一下。打开记事本,输入一个形容词,并将其保存为 .hello 文件(确保不要意外保存为 .hello.txt 文件)。在 Windows 资源管理器中打开该文件。您的程序将运行!但是什么也没发生...

步骤 2:读取文件内容

当注册表设置正确且在 Windows 资源管理器中打开文件时,文件的路径将作为命令行参数传递(如果您将应用程序视为一个函数,那么这些就是参数)。要检索参数,请使用 My.Application.CommandlineArgs。它返回一个 ReadOnlyCollection(Of String)。您可以使用 My.Application.CommandlineArgs(0) 来检索文件路径。

现在,我们必须显示消息。更多用于 Load 事件的代码:

  msgbox("Hello, " & My.Computer.FileSystem.ReadAllText_
	(My.Application.CommandlineArgs(0)) & " World!")

Screenshot - VBFileAssociation2.gif

历史

日期 更改
4/29/07 文章提交
4/30/07
  1. 修复了文章,使其适合单页显示
  2. 更新了演示项目
5/8/07
  1. 解释了 My.Application.CommandLineArgs
6/3/07 添加了 技巧
6/8/07 修复了 DLL 中的问题
6/26/07 更改了一些短语的措辞并修复了示例中的一些错误
6/29/07
  1. 修复了链接
  2. 不再需要横向滚动!
6/19/09 移除了有 bug 的库
8/10/10
  • 重写了示例应用程序,使其不依赖于已移除的库,并且是完全开源的
  • 更新了文章
© . All rights reserved.