Я использую 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;
Проблема заключается в том, что она не меняет раскладку клавиатуры, как ожидалось. Я отлаживал код, и все строки были execeuted; только функция LoadKeyboardLayout не выполнила свою работу.
Как я могу заставить LoadKeyboardLayout работать из фонового потока?