Windows注册表将单个应用程序与具有唯一图标

时间:2017-07-06 01:28:20

标签: wpf windows registry nsis embedded-resource

我正在使用NSIS为我使用WPF开发的应用程序创建安装程序,该应用程序有大约3种不同的文件格式,并且已经广泛阅读了Microsoft提供的指南:https://msdn.microsoft.com/en-us/library/windows/desktop/cc144104

但是我发现它们缺少更复杂的例子,而且当我试图找到其他应用程序如何注册的例子时(在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"和#34;一般用户界面"正在被忽略,而是使用可执行文件中的程序集名称,可能导致这种情况发生?

另一个问题是我希望能够为我在资源管理器中与应用程序关联的每个文件扩展名显示单独的图标。所以我一直在研究使用Resource Hacker™在我的命令行可执行应用程序中插入其他图标和资源,但实际上我完全不确定如何将可执行文件中嵌入的非默认图标与各个扩展相关联并且无法找到任何资源或示例,因此非常感谢正确推动。

最后,我不确定如何使用' REG_EXPAND_SZ'注册表数据类型引用可执行文件中嵌入的字符串和其他资源,在某些示例中,资源名称以' - '为前缀。而在其他情况下,他们不是......因此,对此的任何良好的学习资源也将非常感激。

谢谢, 亚历克斯。

1 个答案:

答案 0 :(得分:1)

如果找不到您的友好名称,Windows将从.exe中读取,并且它还将缓存此名称以供将来使用(HKEY_CURRENT_USER\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\MuiCache和类似的密钥),因此请尝试删除缓存的名称。希望它能找到你真正友好的名字,如果它必须去寻找它。

要为每种类型获取不同的图标,每个类型还需要一个progid(myapp.type1,myapp.type2等),因此您可以为每种类型设置不同的DefaultIcon路径。此路径的语法为c:\path\app.exe[,[-]number],其中...\app.exe,2表示app.exe中的第三个(0,1,2)图标,...\app.exe,-2表示资源ID为2的图标。请参阅{{3更多细节。

@开头的字符串是重定向的字符串,您可以阅读有关this blog post的字符串。

最后一些建议。并非您的示例中的所有内容都使用完整路径,您应始终指定.exe的完整路径。

当其他所有方法都失败时,请使用on MSDN查看Windows正在阅读的内容和位置......