Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf Windows注册表将单个应用程序与具有唯一图标的多个文件类型相关联_Wpf_Windows_Registry_Nsis_Embedded Resource - Fatal编程技术网

Wpf Windows注册表将单个应用程序与具有唯一图标的多个文件类型相关联

Wpf Windows注册表将单个应用程序与具有唯一图标的多个文件类型相关联,wpf,windows,registry,nsis,embedded-resource,Wpf,Windows,Registry,Nsis,Embedded Resource,我正在为我使用WPF开发的应用程序创建安装程序,WPF处理了大约3种不同的文件格式,并广泛阅读了Microsoft提供的指南: 然而,我发现他们缺少更复杂的示例,而且当我试图找到其他应用程序如何在windows注册表中注册自己的示例时,往往与前面提到的指南根本不匹配 但我最终得出以下结论,似乎效果相当不错,当通过资源管理器打开相关文件并显示应用程序可执行文件中的默认图标时,应用程序将启动: # Register the application paths WriteRegStr HKLM "So

我正在为我使用WPF开发的应用程序创建安装程序,WPF处理了大约3种不同的文件格式,并广泛阅读了Microsoft提供的指南:

然而,我发现他们缺少更复杂的示例,而且当我试图找到其他应用程序如何在windows注册表中注册自己的示例时,往往与前面提到的指南根本不匹配

但我最终得出以下结论,似乎效果相当不错,当通过资源管理器打开相关文件并显示应用程序可执行文件中的默认图标时,应用程序将启动:

# Register the application paths
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\App Paths\GUI.exe" "" "$INSTDIR\GUI.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\App Paths\GUI.exe" "Path" "$INSTDIR"

# Register the application
WriteRegStr HKCR "Applications\GUI.exe" "" "GUI"
WriteRegStr HKCR "Applications\GUI.exe" "DefaultIcon" "$INSTDIR\GUI.exe"
WriteRegStr HKCR "Applications\GUI.exe" "FriendlyAppName" "General User Interface"
WriteRegStr HKCR "Applications\GUI.exe" "UseExecutableForTaskbarGroupIcon" ""
WriteRegStr HKCR "Applications\GUI.exe\SupportedTypes" "" ""
WriteRegStr HKCR "Applications\GUI.exe\SupportedTypes\.ext1" "" ""
WriteRegStr HKCR "Applications\GUI.exe\SupportedTypes\.ext2" "" ""
WriteRegStr HKCR "Applications\GUI.exe\SupportedTypes\.ext3" "" ""

# Create the application ProgIDs
WriteRegStr HKCR "GUI.App" "" "GUI"
WriteRegStr HKCR "GUI.App" "DefaultIcon" "GUI.exe"
WriteRegStr HKCR "GUI.App\shell\open\command" "" 'GUI.exe "%1"'

# Associate application file extensions
WriteRegStr HKCR ".ext1" "" "GUI.App"
WriteRegStr HKCR ".ext1\OpenWithProgIds" "GUI.App" ""
WriteRegStr HKCR ".ext2" "" "GUI.App"
WriteRegStr HKCR ".ext2\OpenWithProgIds" "GUI.App" ""
WriteRegStr HKCR ".ext3" "" "GUI.App"
WriteRegBin HKCR ".ext3\OpenWithProgIds" "GUI.App" ""

# Calculate estimated EstimatedSize
${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
IntFmt $0 "0x%08X" $INSTSIZE

# Write Add/Remove Programs Info
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GUI" "DisplayName" "General User Interface"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GUI" "UninstallString" "$INSTDIR\GUI.Uninstaller.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GUI" "DisplayIcon" "$INSTDIR\GUI.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GUI" "Publisher" "General User Interface Publisher"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GUI" "DisplayVersion" ${VERSION}
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GUI" "NoModify" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GUI" "NoRepair" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GUI" "EstimatedSize" $INSTSIZE
但是,我注意到,我指定为“友好”显示值的字符串(如GUI和通用用户界面)被忽略,它使用的是可执行文件中的程序集名称,是什么导致了这种情况

另一个问题是,我希望能够为与资源管理器中的应用程序关联的每个文件扩展名显示一个单独的图标。因此,我一直在研究如何使用从命令行向我的应用程序可执行文件中插入额外的图标和资源,但实际上我完全不确定如何将嵌入可执行文件中的非默认图标与单个扩展相关联,并且找不到任何资源或示例,因此,朝着正确的方向推进将是非常感激的

最后,我不确定如何使用'REG_EXPAND_SZ'注册表数据类型来引用字符串和嵌入在可执行文件中的其他资源,在某些示例中,资源名称前缀为“-”,而在其他示例中,它们不是。。。因此,任何关于这方面的好的学习资源都将非常感激

谢谢,
Alex.

如果.exe找不到您的友好名称,Windows将读取该名称,并将缓存该名称以备将来使用HKEY\U CURRENT\U USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache和类似键,因此请尝试删除缓存的名称。希望它能找到你真正友好的名字,如果它不得不再去找的话

要为每种类型获取不同的图标,您还需要为每种类型myapp.type1、myapp.type2等设置一个progid,以便为每种类型设置不同的DefaultIcon路径。此路径的语法为c:\path\app.exe[,[-]number],其中…\app.exe,2表示app.exe中的第三个0,1,2图标,而…\app.exe,-2表示资源id为2的图标。有关更多详细信息,请参阅

以@开头的字符串是重定向字符串,您可以阅读这些字符串

最后几句忠告。并非示例中的所有内容都使用完整路径,您应该始终指定.exe的完整路径


当所有其他操作都失败时,使用以查看Windows正在读取的内容和位置

是否确实要设置UseExecutableForTaskbarGroupIcon?这不是一件平常的事。在“应用路径”下设置路径值将更改你的应用的%path%,而大多数应用不需要该值。@Anders感谢你的快速回复,不,我不确定这两件事,我的应用程序在当前的%APPDATA%目录下运行,因此它不需要设置路径,我认为这可能是用户试图从控制台运行应用程序时出现的一些问题的根源。太棒了,我想我可能需要为每个扩展创建单独的ProgId,但是犹豫是因为我不想重复shell命令多次,是否可以从为单独的文件扩展名创建的ProgID中引用“基本”ProgID?你可以在ProgID上设置currentversion值,但它会重定向所有IIRC。是的,有一条说明说,只有当你的应用程序安装了并排版本时,才应该使用它,所以我只是为每个扩展复制并粘贴了它,效果非常好。谢谢你给我指明了正确的方向。