-2

我有功能

procedure bgGetKeyboardLayoutList(List: TStrings);
var
  AList : array [0..50] of Hkl;
  AklName: array [0..255] of Char;
  i: Longint;
begin
  List.Clear;
  for i := 0 to GetKeyboardLayoutList(SizeOf(AList), AList) - 1 do
    begin
      GetLocaleInfo(LoWord(AList[i]), LOCALE_SLANGUAGE, AklName, SizeOf(
               AklName));
      List.AddObject(AklName, Pointer(AList[i]));
    end;
end;

该函数被调用

procedure TDefaultInputMethod.Scan;
begin
  bgGetKeyboardLayoutList(FSL);
end;

但是当我尝试在相反的方向使用 SetLocaleInfo 时,我没有成功代码:

procedure TDefaultInputMethod.SetAsDefault(index: integer);
begin
  ActivateKeyboardLayout(Hkl(FSL.Objects[index]), 0); //this line works
  if SetLocaleInfo(LoWord(FSL.Objects[index]), LOCALE_SLANGUAGE, PChar(FSL[index]))  then
     ShowMessage('Uspeh')
  else
    begin
      ShowMessage(IntToStr(GetLastError));
    end;
end;

GetLasrError 返回 1004

在此先感谢博扬

4

1 回答 1

5

ShowMessage(SysErrorMessage(GetLastError));表示1004Invalid flags

根据SetLocaleInfoMSDN 上的文档,这对应于ERROR_INVALID_FLAGS,这是由传递给函数的无效值引起的。

问题出在第二个参数 ( LOCALE_SLANGUAGE) 上,根据文档,它再次不是可以与 . 一起使用的值之一SetLocaleInfo。它只能用于GetLocaleInfo检索信息。(请参阅从Constants Used in the LCType Parameter of GetLocaleInfo, GetLocaleInfoEx, and SetLocaleInfo该页标题开始的部分。)

于 2013-03-23T00:17:43.597 回答