如何按指定LANGID获取多语言环境下的属性列名称?
获取指定语言的属性列标题文本
核心解决方案
利用Windows的IPropertyDescription2扩展接口,它提供的GetDisplayNameEx方法可直接指定LANGID获取对应语言的属性列标题,无需修改系统或线程区域设置。
实现步骤
- 获取基础属性描述接口:
- 针对属性规范名称(如
System.ItemNameDisplay),调用PSGetPropertyDescriptionByName获取IPropertyDescription接口。 - 针对
PROPERTYKEY(如PKEY_FileName),调用PSGetPropertyDescriptionFromPropertyKey获取IPropertyDescription接口。
- 针对属性规范名称(如
- 转换为扩展接口:将
IPropertyDescription查询转换为IPropertyDescription2接口(Windows Vista及以上系统支持)。 - 获取指定语言标题:调用
IPropertyDescription2::GetDisplayNameEx,传入目标LANGID即可得到对应语言的标题文本。
代码示例(C++)
通过属性规范名称获取指定语言标题
#include <propsys.h> #include <propkey.h> #pragma comment(lib, "propsys.lib") HRESULT GetPropertyDisplayNameForLang(LPCWSTR pszPropCanonicalName, LANGID langid, PWSTR* ppszDisplayName) { if (!pszPropCanonicalName || !ppszDisplayName) return E_INVALIDARG; *ppszDisplayName = nullptr; IPropertyDescription* pPropDesc = nullptr; HRESULT hr = PSGetPropertyDescriptionByName(pszPropCanonicalName, IID_PPV_ARGS(&pPropDesc)); if (SUCCEEDED(hr)) { IPropertyDescription2* pPropDesc2 = nullptr; hr = pPropDesc->QueryInterface(IID_PPV_ARGS(&pPropDesc2)); if (SUCCEEDED(hr)) { hr = pPropDesc2->GetDisplayNameEx(langid, ppszDisplayName); pPropDesc2->Release(); } pPropDesc->Release(); } return hr; }
通过PROPERTYKEY获取指定语言标题
HRESULT GetPropertyDisplayNameForPKEY(const PROPERTYKEY& pk, LANGID langid, PWSTR* ppszDisplayName) { if (!ppszDisplayName) return E_INVALIDARG; *ppszDisplayName = nullptr; IPropertyDescription* pPropDesc = nullptr; HRESULT hr = PSGetPropertyDescriptionFromPropertyKey(pk, IID_PPV_ARGS(&pPropDesc)); if (SUCCEEDED(hr)) { IPropertyDescription2* pPropDesc2 = nullptr; hr = pPropDesc->QueryInterface(IID_PPV_ARGS(&pPropDesc2)); if (SUCCEEDED(hr)) { hr = pPropDesc2->GetDisplayNameEx(langid, ppszDisplayName); pPropDesc2->Release(); } pPropDesc->Release(); } return hr; }
使用说明
- 常用
LANGID:英语(美国)为0x0409,西班牙语(西班牙)为0x0C0A。 - 若系统未安装目标语言的属性资源,方法会返回系统默认语言的标题作为降级备选。
- 程序需链接
propsys.lib,且运行环境为Windows Vista及以上系统。
内容的提问来源于stack exchange,提问作者davecupper
相关产品推荐
相关产品推荐

