You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何SetThreadPreferredUILanguages()无法修改所有固有Shell项属性语言?

获取指定语言的文件属性文本问题

我需要获取文件属性的特定语言文本,此问题关联此前的提问《如何获取不同语言的文件属性?》。多数文件文本属性为读写属性,不受当前线程语言影响,但部分只读/固有属性(如已知文件夹名称、PKEY_ItemType、PKEY_ItemTypeText等)会受语言影响。

我的PC安装了英语和泰语,系统默认语言为英语。修改线程语言后调用IPropertyStore::GetValue()获取属性值时,有时返回对应语言的正确文本,有时则不。我希望使用IPropertyStore::GetValue()或替代方法,获取线程当前语言对应的文本。

以下是基于Raymond Chen博客《临时修改线程首选UI语言的正确方式?》及Jeaninez - MSFT建议编写的测试程序,以及标注了正误的输出结果:

#include <Windows.h>
#include <iostream>
#include <objbase.h>
#include <propkey.h>
#include <Shlobj.h>

void ShowProperty(const WCHAR *pczDesc, LPITEMIDLIST pidlItem, const PROPERTYKEY& infoKey)
{
    IPropertyStore         *pIStore;
    PROPVARIANT             propValue;

    if(SHGetPropertyStoreFromIDList(pidlItem, GPS_DEFAULT, IID_PPV_ARGS(&pIStore)) == S_OK)
    {
        PropVariantInit(&propValue);
    
        if(pIStore->GetValue(infoKey, &propValue) == S_OK)
        {
            wprintf(L"%s<%s>\n", pczDesc, propValue.bstrVal);

            PropVariantClear(&propValue);
        }

        pIStore->Release();
    }
}

int main()
{
    const WCHAR    *pczLang1;
    const WCHAR    *pczLang2;
    LPITEMIDLIST    pidlSystem32;
    LPITEMIDLIST    pidlKnownFolder;
    ULONG           nNumLanguages;

    CoInitialize(nullptr);

    pczLang1 = L"en-GB"; // English
    pczLang2 = L"th-TH"; // Thai

    ULONG cLanguages;                     // From Raymond Chen's blog "What is the correct way of 
    PZZWSTR pszzPrevLanguages = NULL;     // temporarily changing a thread's preferred UI language?"
    ULONG cchPrevLanguages = 0;           //

    if((pidlSystem32 = ILCreateFromPath(L"C:\\Windows\\System32")) != NULL)
    {
        if(SHGetKnownFolderIDList(FOLDERID_Music, KF_FLAG_DEFAULT, NULL, &pidlKnownFolder) == S_OK)
        {
            wprintf(L"\n------- %s ------------\n", pczLang2);

            nNumLanguages = 1;
            SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME, pczLang1, &nNumLanguages);

            // error checking elided for simplicity              // From blog.
            // Get the current thread preferred UI languages     //
            GetThreadPreferredUILanguages(MUI_LANGUAGE_NAME |    //
                                          MUI_THREAD_LANGUAGES,  //
                                          &cLanguages, NULL,     //
                                          &cchPrevLanguages);    //
            pszzPrevLanguages = new WCHAR[cchPrevLanguages];     //
            GetThreadPreferredUILanguages(MUI_LANGUAGE_NAME |    //
                                          MUI_THREAD_LANGUAGES,  //
                                          &cLanguages,           //
                                          pszzPrevLanguages,     //
                                          &cchPrevLanguages);    //

            nNumLanguages = 1;
            SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME, pczLang2, &nNumLanguages);

            ShowProperty(L"System32 folder name:      ", pidlSystem32,    PKEY_ItemNameDisplay);
            ShowProperty(L"System32 folder type:      ", pidlSystem32,    PKEY_ItemType);
            ShowProperty(L"System32 folder type text: ", pidlSystem32,    PKEY_ItemTypeText);
            ShowProperty(L"Known folder name:         ", pidlKnownFolder, PKEY_ItemNameDisplay);
            ShowProperty(L"Known folder type:         ", pidlKnownFolder, PKEY_ItemType);
            ShowProperty(L"Known folder type text:    ", pidlKnownFolder, PKEY_ItemTypeText);

            wprintf(L"\n------- %s ------------\n", pszzPrevLanguages);

            // Restore the original thread preferred UI languages // From blog.
            SetThreadPreferredUILanguages(MUI_LANGUAGE_NAME,      // 
                                          pszzPrevLanguages,      // 
                                          &cLanguages);           // 
            delete[] pszzPrevLanguages;                           // 

            ShowProperty(L"System32 folder name:      ", pidlSystem32,    PKEY_ItemNameDisplay);
            ShowProperty(L"System32 folder type:      ", pidlSystem32,    PKEY_ItemType);
            ShowProperty(L"System32 folder type text: ", pidlSystem32,    PKEY_ItemTypeText);
            ShowProperty(L"Known folder name:         ", pidlKnownFolder, PKEY_ItemNameDisplay);
            ShowProperty(L"Known folder type:         ", pidlKnownFolder, PKEY_ItemType);
            ShowProperty(L"Known folder type text:    ", pidlKnownFolder, PKEY_ItemTypeText);

            ILFree(pidlKnownFolder);
        }

        ILFree(pidlSystem32);
    }

    CoUninitialize();
    return 0;
}

输出结果:

------- th-TH ------------
System32 folder name:      <System32>      正确
System32 folder type:      <Directory>     错误
System32 folder type text: <โฟลเดอร์แฟ้ม>    正确
Known folder name:         <เพลง>          正确
Known folder type:         <Directory>     错误
Known folder type text:    <โฟลเดอร์ระบบ>   正确

------- en-GB ------------
System32 folder name:      <System32>       正确
System32 folder type:      <Directory>      正确
System32 folder type text: <โฟลเดอร์แฟ้ม>    错误
Known folder name:         <เพลง>           错误
Known folder type:         <Directory>      正确
Known folder type text:    <System Folder>  正确

内容的提问来源于stack exchange,提问作者davecupper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:03:16