VB.NET 文件关联






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

是否曾希望用户打开特定类型的文件时,您的应用程序也会随之启动?这可以通过编辑几个注册表项来轻松实现。
程序如何关联?
注册表存储所有文件类型与应用程序的关联。点击“开始”菜单 -> “运行” -> 输入“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"... |
|
CreateSubKey("Hello" & _ "\shell\open\command") |
这会创建“Hello ”子项和“store\open\command ”子项,这些是存储将打开此文件类型的应用程序路径所必需的。 |
.SetValue("", Application.ExecutablePath & _ " ""%l"" ",... |
|
现在运行您的应用程序一次。它将编辑注册表。您的程序现在已与 .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!")
历史
日期 | 更改 | |
4/29/07 | 文章提交 | |
4/30/07 |
|
|
5/8/07 |
|
|
6/3/07 | 添加了 此 技巧 | |
6/8/07 | 修复了 DLL 中的问题 | |
6/26/07 | 更改了一些短语的措辞并修复了示例中的一些错误 | |
6/29/07 |
|
|
6/19/09 | 移除了有 bug 的库 | |
8/10/10 |
|