LoadKeyboardLayout関数を使用して、この方法でキーボード レイアウトを読み込んで有効にしています。
procedure TfrmMain.eSearchEnter(Sender: TObject);
begin
LoadKeyboardLayout('00000429', KLF_ACTIVATE);
end;
完全に機能しますが、この変更には時間がかかるため、アクティブなフォームが 1 ~ 2 秒間フリーズします。これを防ぐために、このコードを次のようなバックグラウンド スレッドに移動しました。
type
FLangChangeThread = class(TThread)
private
FLang: string;
protected
procedure Execute; override;
public
property Lang: string read FLang write FLang;
end;
implementation
procedure FLangChangeThread.Execute;
begin
if FLang = 'EN' then
LoadKeyboardLayout('00000409', KLF_ACTIVATE)
else
if FLang = 'FA' then
LoadKeyboardLayout('00000429', KLF_ACTIVATE);
end;
このバックグラウンド スレッドは、次のように実行しています。
procedure TfrmMain.ChangeWritingLanguage(ALang: string);
begin
with FLangChangeThread.Create(True) do
begin
FreeOnTerminate := True;
Lang := ALang;
Resume;
end;
end;
procedure TfrmMain.eSearchEnter(Sender: TObject);
begin
ChangeWritingLanguage('FA');
end;
問題は、期待どおりにキーボード レイアウトが変更されないことです。コードをデバッグしたところ、すべての行が実行されました。LoadKeyboardLayout関数だけが機能していません。
LoadKeyboardLayout関数をバックグラウンド スレッドから動作させるにはどうすればよいですか?