Win10中如何确定所选键盘语言的代码页?

How can I determine the codepage of the selected keyboard language in Win10?

出于某种原因,我需要当前进程中当前选定的键盘布局设置的语言的代码页。 (我使用 Win10 和每个应用程序的语言设置)

当 UI 语言改变时,

getThreadLocale 不会改变。它返回进程的默认语言环境。

getProcessInformation/getThreadInformation不包含任何关于当前language/locale的信息。

我认为需要的信息链是:

所选语言 => 匹配语言环境 => 代码页

如果我有当前的区域设置 ID(与所选语言匹配),那么我可以通过以下方式获取其代码页:

getLocaleInfoW( idLocale, LOCALE_IDEFAULTANSICODEPAGE, buff, buffSize );

是否有任何 winapi 调用来获取上述信息?

GetACP() returns“ansi”代码页...大声笑,不是真正的 ansi,但这就是 windows 所说的。在调用 GetACP() 之后,还可以使用 GetCPInfo() 获取附加信息。对于使用双字节字符集的日文、中文和其他远东语言,事情变得更加棘手。我仍在开发一个 MBCS 应用程序。如果我们可以转换为 Unicode 就好了,但它没有发生,而且很快就不会成为我的问题。

TLabel 标题通过 TButton 设置为与当前键盘语言关联的 CodePageOnClick 事件处理程序。

unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm3 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.Button1Click(Sender: TObject);
var
  tid : word;
  lid : word;
  ndxLocale, buffSize : integer;
  localeName : string;
  buff : pchar;
begin
  tid := getCurrentThreadID;
  lid := getKeyboardLayout( tid );
  ndxLocale := languages.IndexOf( lid );
  localeName := languages.LocaleName[ndxLocale];
  buffSize := getLocaleInfoEx( pchar( localeName ), LOCALE_IDEFAULTANSICODEPAGE, NIL, 0 );
  getMem( buff, buffSize*sizeOf(char) );
  try
    getLocaleInfoEx( pchar( localeName ), LOCALE_IDEFAULTANSICODEPAGE, buff, buffSize );
    label1.caption := strPas( buff );
  finally
    freeMem( buff );
  end;
end;