0

我在安装了中文和法语 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;
4

3 回答 3

2

EnumUILanguages 只调用回调,只要你在回调中返回 true。难道是你在第一个回调中返回 false 并且 EnumUILanguages 停止了吗?

于 2010-02-23T15:39:41.353 回答
1

这是一个相当古老的问题,但仍然没有答案。因为我遇到了同样的问题并且能够解决它,所以我想分享我的解决方案。

如果你在 Delphi 下开发,问题是回调函数的返回类型。将其声明为DWORD并编写Result := 1. Delphi 的调用代码True无法识别为.TRUEEnumUILanguages

幸运的是 ;-) Delphi 的单元Winapi.Windows.pas缺少(在 XE2 下)EnumUILanguages其回调函数的声明和函数类型,因此您可以自己声明它。

于 2014-09-12T13:27:59.677 回答
0

将 dwFlags 设置为 0 意味着 MUI_LANGUAGE_ID 或 MUI_LICENSED_LANGUAGES。这意味着两件事:

  • 你没有得到语言名称,你得到的是“十六进制语言标识符”。我认为它们是正确的 PWideChars,但我不能 100% 确定。你是?
  • 您只获得许可语言,这可能解释了单一结果。尝试使用 MUI_ALL_INSTALLED_LANGUAGES 标志。

于 2010-02-24T05:53:01.507 回答