Pat*_*ick 5 c# windows file-association
好的,我已经查看了所有内容,但我很难弄清楚如何将自定义文件类型与我的 C# 应用程序关联起来。我使用的是 Visual Studio 2008,由于公司部署的原因,我只能使用 .NET 2.0。
基本上我真正想做的就是能够允许用户双击我的自定义文件类型或将其拖放到应用程序图标上并加载数据,以及在文件本身上显示自定义图标。我可以通过对话框打开文件,一切都很好。
尝试阅读 Microsoft 的在线文档很难理解,并且并没有真正提供我需要的所有详细信息。如果有人知道我在哪里可以找到好的教程或者可以解释它,我将不胜感激。
谢谢帕特里克
几年前我在新闻组中写过这个。浏览了一下,我发现它不是我写过的最清晰的,但它相当完整。就其价值而言,我将其转载如下:
\n\n首先,您需要在下面创建一个子项,HKEY_CLASSES_ROOT该子项将保存启动应用程序的命令。您应该将此键命名为半描述性的名称。您的文件扩展名将映射到此键。例如,txtfile默认情况下,TXT 文件映射到名为 的键。使用此设置的好处是,如果您的应用程序可以处理多个扩展,则可以将它们全部映射到此键。例如,许多图像编辑应用程序创建一个名为“imagefile”之类的子项,并将 .bmp、.jpg、.gif 等映射到该项。我们将您的密钥称为“JoeBlowFile”。接下来,您需要将新的 JoeBlowFile 键的“默认”值设置为一个文本字符串,向用户描述他们拥有的文件类型。这就是 Windows 资源管理器中“类型”下显示的内容。同样,以 TXT 文件为例,这里的一个好的字符串是“Text File”或“Text Document”。(默认情况下是后者。)您的字符串可能是“Joe Blow Data”。
现在,在新项下,您可以创建另一个子项,名为“DefaultIcon”。顾名思义,这设置了与此类文件一起使用的图标。您应该创建一个自定义图标,以图形方式表示您的程序处理的文档。您可以将此图标另存为应用程序目录中的 ICO 文件,但更好的是,您可以将其作为资源包含在 EXE 或 DLL 中。无论哪种方式,您都需要将子项的默认值设置为表示 ICO、EXE 或 DLL 的完整路径和文件名的字符串。如果文件中有多个图标(特别是如果您将其作为资源包含在 EXE 或 DLL 中),您还需要添加一个逗号,以及代表哪个图标的从零开始的正索引号您想要使用的资源 ID,或者负资源 ID,使用您在资源脚本中为图标分配的任何 ID 的负数。例如,您的可能是“C:\\Program Files\\JoeBlow\\JoeBlow.exe, 2”。
\n\n\n\n\n关于上一段的 C# 开发人员注意事项。不幸的是,C# 项目不能有资源脚本。通过将资源添加到项目并指定它们为“嵌入式资源”来添加到 .NET 应用程序的资源包含在新的 .NET 特定格式中,该格式与以前的方法不兼容。在 VS.NET 上使用 C# 可以正确嵌入到应用程序中的唯一图标是应用程序图标,可从项目属性访问。如果您需要其他图标\xe2\x80\x94e.g. 一个 \n 图标来表示由您的应用程序处理的文档文件,而不是表示应用程序本身\xe2\x80\x94您需要包含 ICO 文件本身,使用嵌入图标的 C++ 编译 DLL,或者创建并编译资源脚本并将其从项目属性包含到您的项目中。
\n
无论您是否选择使用该DefaultIcon密钥,您现在都需要在该JoeBlowFile密钥下创建一个名为“shell”的子项。在该shell键下,您将为您希望用户能够从上下文菜单(右键单击菜单)对您的文件类型执行的每个命令创建单独的键。这些项目称为“动词”。为了保持一致性,其中之一应该是“open”\xe2\x80\x94,如果该键存在,则该键将成为默认键(即,当用户双击您类型的文件时,将执行打开命令)。相反,您可以将“shell”键的默认值设置为您想要默认执行的动词。您可以选择将每个动词键的默认值设置为您希望在用户右键单击您类型的文件时出现在上下文菜单中的文本。在此文本中可以使用与号 (&) 来指定后面的字符将带下划线,这意味着用户可以按与该字符对应的键从上下文菜单中选择该命令。例如,对于“打开”键,您可以将“使用 &Joe Blow\'s app 打开”作为默认值。然后,带有下划线 J 的文本将出现在该类型文件的上下文菜单中,用户可以按字母 J 启动 Joe Blow 的应用程序。
不过,使用“open”(和后续)键,您唯一要做的就是创建另一个键作为“command”键的子键。命令键的默认值必须设置为仅表示\xe2\x80\x94 执行该操作所需的命令的字符串。例如,“open”键下的命令键中的默认字符串可能是“C:\\Program Files\\JoeBlow\\JoeBlow.exe”“%1”。请注意应用程序的路径\\文件名和%1. 仅当路径或文件名中存在空格时,它们才需要在应用程序的路径\\文件名周围,但对于%132 位应用程序来说,它们绝对是必需的。就像旧的 MS-DOS 批处理 (.bat) 文件 %1一样。替换为命令行上的第一个参数,在本例中,该参数成为应用程序应该打开的文件的文件名。因为您事先不知道包含您要打开的文件的路径或文件名是否包含空格,所以您必须将引号括起来。%1%1%1
还应包括您的应用程序所需的其他参数。例如,“print”键下的“command”键中的默认值可能是“”C:\\Program Files\\JoeBlow\\JoeBlow.exe”“%1”/print”或“”C :\\Program Files\\JoeBlow\\JoeBlow.exe" /print "%1""。这取决于您希望如何在应用程序中处理命令行参数。
\n\n\n\n\n关于可替换参数(如上面提到的“%1”)的注释。显然,“%1”参数/可以/替换为要打开的短文件名。情况并非总是如此,我还没有弄清楚Windows使用什么标准来确定它将通过\xe2\x80\x94短或长。可能是,如果注册表中列出的可执行路径是长文件名,Windows 会将 %1 替换为长文件名来启动,但如果可执行路径是短文件名,或者可以解释为 1,Windows 将替换
\n\n%1为短文件名。如果您想确保始终获得长文件名,请改用“%L”。您可以使用大写的 L(就像我所做的那样)或小写的 L,但我更喜欢使用大写,因为小写的“l”看起来太像数字“1”。更重要的是,如果您的程序知道如何处理 Shell 项 ID,您可以使用“%i”参数获取该 ID,而不是长文件名。同样,大写或小写“i”同样合适,但我发现大写“I”很难与小写“l”和数字“1”区分开。如果您不知道 Shell Item ID 是什么,也没关系。您可能永远不需要使用它。
\n
你终于用完了钥匙JoeBlowFile。剩下的就比较简单了。您只需在 HKEY_CLASSES_ROOT 下创建(如果尚不存在)另一个子项,并将其命名为与文档类型的扩展名相同的名称。要使用 txtfile 示例,名称将为“.txt”(带点,但不带引号)。您的(Joe Blow 的)可能是“.jbf”(代表 Joe Blow 文件)。现在必须将此键的默认值设置为您创建的第一个键的名称,在我们使用的示例中是“JoeBlowFile”。
就是这样。您已完成注册表操作。请记住,您必须确保您的应用程序处理命令行的方式与您在“shell”键下设置的命令一致。当您的应用程序启动时,Windows 不会自动为您打开该文件...您必须这样做。
\n\n从图形上看,它看起来像这样:
\n\n\nHKEY_CLASSES_ROOT \n| +--.jbf = JoeBlowFile \n| \n+--JoeBlowFile = Joe Blow 数据 \n | \n +--DefaultIcon = C:\\Program Files\\JoeBlow\\JoeBlow.exe, 2 \n | \n +--外壳 \n | \n +--open = 使用 &Joe Blow 的应用程序打开 \n | | \n | +--command = "C:\\Program Files\\JoeBlow\\JoeBlow.exe" "%1" \n | \n +--打印 \n | \n +--command = "C:\\Program Files\\JoeBlow\\JoeBlow.exe" "%1" /print\n\n\n
如果您还不知道如何修改注册表,请在 MSDN 中查找以“Reg”开头的所有函数,包括 RegOpenKeyEx、RegCreateKeyEx 和 RegSetValueEx。您还可以通过创建“.reg”文件并简单地使用 ShellExecuteEx() 调用“regedit.exe /s”来完成此操作。(这/s可以防止 Regedit 弹出消息框询问“您确定要将 [name of file.reg] 中的信息添加到注册表吗?”)REG 文件的格式简单直接。下面是一个示例 REG 文件,用于添加上面的“JoeBlow”示例:
\nREGEDIT4 \n\n[HKEY_CLASSES_ROOT\\.jbf]\n@="JoeBlowFile"\n\n[HKEY_CLASSES_ROOT\\JoeBlowFile]\n@="Joe Blow Data"\n\n[HKEY_CLASSES_ROOT\\JoeBlowFile\\ DefaultIcon]\n@="C:\\\\Program Files\\\\JoeBlow\\\\JoeBlow.exe, 2"\n\n[HKEY_CLASSES_ROOT\\JoeBlowFile\\Shell]\n\n[HKEY_CLASSES_ROOT\ \JoeBlowFile\\Shell\\open]\n@="使用 &Joe Blow\ 的应用程序打开"\n\n[HKEY_CLASSES_ROOT\\JoeBlowFile\\Shell\\open\\command]\n@="\\" C:\\\\Program Files\\\\JoeBlow\\\\JoeBlow.exe\\" \\"%1\\""\n\n[HKEY_CLASSES_ROOT\\JoeBlowFile\\Shell\\print]\n @="&Print"\n\n[HKEY_CLASSES_ROOT\\JoeBlowFile\\Shell\\print\\command]\n@="\\"C:\\\\Program Files\\\\JoeBlow\\\\JoeBlow .exe \\"%1\\" /print" \n\n\n\n
确保包含“REGEDIT4”作为文件的第一行,否则它将无法工作。另外,请确保在最后一行按 Enter 键,否则该行将不会被读入。总之,以这种方式将程序添加到注册表并不像听起来那么方便,因为您必须修改您的REG 文件(如果您的应用程序安装在 C:\\Program Files\\JoeBlow之外的任何位置)。
\n\n\n\n\n上述说明针对的是使用 C 或 C++ 直接对 Win32 API 进行编程的用户。对于 .NET 上的 C#,这要容易一些。查看Registry类,或者您甚至可以使用VS.NET中的部署项目以图形方式完成大部分工作。
\n
要将本机可访问的资源添加到 .NET 程序集中,您将需要一个资源脚本。资源脚本是纯文本文件,就像代码文件一样。事实上,它是代码;由资源编译器 rc.exe 编译的声明性代码。示例资源脚本如下:
\n\n#include <windows.h>\n\n#define IDI_APP 100\n#define IDI_FILE 200\n#define ID_VERSION 1\n\nIDI_APP ICON "Resources\\\\Application.ico"\nIDI_FILE ICON "Resources\\\\JowBlowFile.ico"\n\nID_VERSION VERSIONINFO\n FILEVERSION 1, 0, 19, 186 // change this to your version\n PRODUCTVERSION 1, 0, 19, 186 // change this to your version\n FILEOS VOS__WINDOWS32\n FILETYPE VFT_APP {\n BLOCK "StringFileInfo" {\n BLOCK "040904B0" { // 0x409 = U.S. English, 0x04B0 = dec 1200 = Unicode\n VALUE "CompanyName", "Joe Blow, Inc.\\0"\n VALUE "FileDescription", "Joe Blow\'s App\\0"\n VALUE "FileVersion", "1.0.19.186\\0" // change this to your version\n VALUE "InternalName", "JoeBlow\\0"\n VALUE "LegalCopyright", "Copyright \xc2\xa9 2008-2009 Joe Blow Incorporated\\0"\n VALUE "OriginalFilename", "JoeBlow.exe\\0"\n VALUE "ProductName", "Joe Blow\\0"\n VALUE "ProductVersion", "1.0.19.189\\0" // change this to your version\n }\n }\n BLOCK "VarFileInfo" {\n VALUE "Translation", 0x409 /*U.S. English*/, 1200 /*Unicode*/\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n\n这样做的最大缺点是您必须手动将版本信息添加到资源脚本中(除非您想完全放弃版本信息)。在我的应用程序中,我添加了一个自定义构建步骤,该步骤运行我编写的程序,该程序直接在可执行文件中更新版本信息,这样我就不必手动更新资源脚本中的版本号,但该程序不适合供公开发布,否则超出了本文的范围。
\n\n现在您需要调用资源编译器将此资源脚本构建为二进制资源文件。将此脚本保存为 JoeBlow.rc,然后启动 Visual Studio 命令提示符。它位于 Visual Studio 开始菜单文件夹中的“工具”下。如果您没有安装 Visual Studio,我相信您会获得 rc.exe 作为 SDK 的一部分。微软似乎也在这里提供最新版本。
\n\n一旦出现 VS cmd 提示符(或者路径中有 rc.exe),只需键入:
\n\n\nrc JoeBlow.rc\n
就那么简单。鉴于我包含的图标存在,上述资源脚本应该可以正确编译。这将在同一目录中创建一个名为 JoeBlow.res 的新文件。现在,假设您使用的是Visual Studio,您所要做的就是编辑项目属性以包含此资源文件。
\n\n这些说明适用于 Visual Studio 2005 或 2008。我不记得如何执行此操作,或者即使可以在旧版本中执行此操作,而且我还没有尝试过 2010,但它可能类似。右键单击“解决方案资源管理器”中的项目,然后选择“属性”(或从主菜单栏的“项目”菜单中选择“属性”)。在“应用程序”选项卡(您应该看到的第一个选项卡)上,底部是“资源”组框。在这里,您有两个选项:“图标和清单”或“资源文件”。选择后一个选项。这将启用文本框,您可以在其中键入(或浏览到)新资源文件 JoeBlow.res。
\n\n最后,只需构建您的项目,您就可以在浏览与应用程序关联的文件时以本机 PE 格式嵌入可访问 shell 的图标。现在,如果您将 的值设置HKEY_CLASSES_ROOT\\JoeBlowFile\\DefaultIcon为C:\\Program Files\\JoeBlow\\JoeBlow.exe,1(使用从零开始的索引号)或C:\\Program Files\\JoeBlow\\JoeBlow.exe,-200(使用资源标识符的负数,上面 #define 为IDI_FILE),您的图标将显示在 .jbf 文件的资源管理器中。
要让新图标在安装后立即显示,您可能需要刷新 shell 的图标缓存。我在这里找到了如何执行此操作的说明。基本要点是将 shell 图标大小(在 处HKEY_CURRENT_USER\\Control Panel\\Desktop\\WindowMetrics)从当前值更改为不同的值,然后再更改回来,并WM_SETTINGCHANGE在每次更改后广播一条消息。
祝你好运。需要帮助请叫我。
\n| 归档时间: |
|
| 查看次数: |
7515 次 |
| 最近记录: |