我在安装了中文和法语shell语言包(MUI)的Windows XP Embedded版本上使用Win API函数EnumUILanguages,但API调用只返回一种语言代码:0409(基本的en-US安装语言) )。
如果我查看HKLM \ SYSTEM \ CurrentControlSet \ Control \ Nls \ MUILanguages \下的注册表,那么我可以看到所有可用语言(0409,040C,0804)。我更喜欢使用API调用而不是直接访问注册表....任何关于为什么这个API调用只返回唯一语言的建议?
谢谢,邓肯
更新:一些代码和信息 - 我是从带有备忘录框和按钮的表单中调用它的。按下按钮,启动WinAPI调用并传递指向TMemoBox的Strings属性的指针,以便回调函数可以写入。
// The Button handler
procedure TForm1.btnEnumLangsClick(Sender: TObject);
var
dwFlags : DWORD;
callback : TEnumUILanguagesProc;
begin
dwFlags := 0; // Same as MUI_LANGUAGE_ID for WinXP compat
EnumUILanguagesW( @EnumUILanguages_Callback,
dwFlags,
LParam(memoUILangs.Lines) // Pointer to Memo box text lines
);
end;
// API Callback function:
function EnumUILanguages_Callback(lpUILanguageString: PWideChar;
List: TStringList): BOOL; stdcall;
begin
// Add language ID to the memo box
List.Add(lpUILanguageString);
// Return true so the callback continues to run
Result := True;
end;
答案 0 :(得分:2)
只要在回调中返回true,EnumUILanguages只会调用回调。可能是你在第一个回调中返回false并且EnumUILanguages停止了吗?
答案 1 :(得分:1)
这是一个相当古老的问题,但仍然没有答案。因为我遇到了同样的问题而且能够解决它,我想分享我的解决方案。
如果您在Delphi下开发,问题是回调函数的返回类型。将其声明为DWORD
并写入Result := 1
。调用代码True
无法将Delphi的TRUE
识别为EnumUILanguages
。
幸运的是;-) Delphi的单位Winapi.Windows.pas
缺少(在XE2下)EnumUILanguages
的声明及其回调函数的函数类型,因此您可以自己声明它。
答案 2 :(得分:0)
将dwFlags设置为0表示MUI_LANGUAGE_ID或MUI_LICENSED_LANGUAGES。这意味着两件事: