我一直在尝试从桌面应用程序获取系统上安装的所有 UWP 应用程序的显示名称(应用程序的用户友好名称)。我正在尝试使用SHLoadIndirectString()
从与这些应用程序对应的注册表项获得的资源字符串。让我们以 windows 计算器为例。
SHLoadIndirectString() 用法
它的资源字符串可以从HKEY_CLASSES_ROOT\Local Settings\Software\Microsoft\Windows\CurrentVersion\AppModel\Repository\Packages\Microsoft.WindowsCalculator_10.1705.1301.0_x64__8wekyb3d8bbwe\DisplayName
注册表项中获取。我系统上的资源字符串是@{Microsoft.WindowsCalculator_10.1705.1301.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.WindowsCalculator/Resources/AppStoreName}
要获得显示名称,我会这样做SHLoadIndirectString(@{Microsoft.WindowsCalculator_10.1705.1301.0_x64__8wekyb3d8bbwe?ms-resource://Microsoft.WindowsCalculator/Resources/AppStoreName})
。
实验观察
- (实验 1)我用于
SHLoadIndirectString()
两个不同的用户(U1 和 U2)。U1 的语言设置为英语,U2 的语言设置为法语(FR-fr)。当 SHLoadIndirectString() 从 U1 运行时,它返回Windows Calculator
,而对于 U2,我得到了Calculatrice Windows
. 因此,相同资源字符串的返回值取决于当前用户的语言设置。 - (实验2)我在U2中安装了一个UWP应用,对DiplayName中的资源字符串做了SHLoadIndirectString()。我在 U1 中遇到错误,但在 U2 中,它正确地给了我所需的字符串。
- (实验 3)当我将资源文件的路径添加
(resources.pri)
到资源字符串时,我在 U1 中没有错误。之前的资源字符串是@{DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar_5.1.12.0_x64__3nf5xjt6s13jt?ms-resource://DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar/Resources/AppName}
,我后来@{C:\\Program Files\\WindowsApps\\DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar_5.1.12.0_x64__3nf5xjt6s13jt\\resources.pri?ms-resource://DJiT.edjing-DJmixerconsolestudio-PlayMixRecordShar/Resources/AppName}
在传递给 之前对其进行了SHLoadIndirectString()
。
寻找解决方案
- SHLoadIndirectString() 的文档说它的返回值取决于
Shell environment or ResourceContext
,但没有给出每个细节的详细信息。 尝试重新创建 windows NT API 以运行 windows 应用程序的两个项目是ReactOS和wine。我查看了他们的源代码以找到 的实现
SHLoadIndirectString()
,但代码似乎所做的只是在删除开头LoadLibrary()
的符号后对资源字符串执行 a 操作。@
这没有任何意义,为什么系统中会有这样的dll,因为每个应用程序的资源字符串都不一样?