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
设置为与当前键盘语言关联的 CodePage
。OnClick
事件处理程序。
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;
出于某种原因,我需要当前进程中当前选定的键盘布局设置的语言的代码页。 (我使用 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
设置为与当前键盘语言关联的 CodePage
。OnClick
事件处理程序。
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;