windows 从控制面板获取用户首选语言列表的正确方法是什么?

dxxyhpgq  于 2023-02-20  发布在  Windows
关注(0)|答案(1)|浏览(143)

在Windows 10(以及更早版本--这似乎是在Win8?中引入的?)的“语言设置”控制面板中有一个“首选语言”列表。通过编程获取该列表的正确方法是什么?
我可以看到它存储在注册表的HKEY_CURRENT_USER\Control Panel\International\User Profile\Languages中,但我假设它不打算直接读取。
我发现了一个API GetUserPreferredUILanguages,听起来是正确的--但是它返回了错误的结果。
具体来说,在控制面板和注册表项中,我当前有en-NZ en-US it-IT列表,但API返回en-GBen-US,我不知道它是从哪里得到的(或者为什么缺少意大利语)。
GetUserDefaultLocaleName API确实正确地返回了en-NZ,但它似乎也是从其他地方获得的--当我重新排列控制面板中的语言列表时,注册表会更新,但API返回值不会改变。
我确实想要完整的语言列表,而不仅仅是一个单一的答案。(另外,出于好奇,API是从哪个控制面板获得答案的?)

dgiusagp

dgiusagp1#

您可以使用bcp47langs.dll中未记录的GetUserLanguages API,该API自Windows 8起可用。

#include <hstring.h>
#include <winstring.h>

typedef int (WINAPI* GetUserLanguagesFn)(char Delimiter, HSTRING* UserLanguages);

int main()
{
    auto h = LoadLibrary(L"bcp47langs.dll");
    auto fn = (GetUserLanguagesFn)GetProcAddress(h, "GetUserLanguages");
    HSTRING str;
    fn(',', &str);
    WindowsDeleteString(str);
    return 0;
}
public static void Main(string[] args)
{
    GetUserLanguages(',', out var langs);
    Console.WriteLine(langs);
}

[DllImport("bcp47langs")]
private static extern int GetUserLanguages(char Delimiter, [MarshalAs(UnmanagedType.HString)] out string UserLanguages);

PS:也有GetUserLanguageInputMethods存在,可以获得一种语言的输入法列表:

[DllImport("bcp47langs")]
public static extern int GetUserLanguageInputMethods(string Language, char Delimiter, [MarshalAs(UnmanagedType.HString)] out string InputMethods);

键盘布局的字符串格式:
<LangID>:<KLID>
文本服务的字符串格式为:
<LangID>:{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
代表"西蒙·穆里尔"摆姿势。

相关问题