gpt4 book ai didi

delphi - 如何在后台线程中使用LoadKeyboardLayout?

转载 作者:行者123 更新时间:2023-12-03 14:42:07 27 4
gpt4 key购买 nike

我正在使用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函数在后台线程工作?

最佳答案

首先,您应该检查 LoadKeyboardLayout 的结果函数,如果失败,您应该检查 GetLastError 返回的错误函数来确定问题所在。

但是即使这个函数调用成功,它也会激活输入区域设置标识符,但是对于您的工作线程来说。作为LoadKeyboardLayout KLF_ACTIVATE 的引用状态标志(我强调的):

KLF_ACTIVATE

If the specified input locale identifier is not already loaded, the function loads and activates the input locale identifier for the current thread.

<小时/>

尽管如此,如果您想在整个过程中加载并激活键盘布局,您可以尝试组合 KLF_ACTIVATE带有 KLF_SETFORPROCESS 的标志一:

const
KLF_SETFORPROCESS = $00000100;
begin
if LoadKeyboardLayout('00000429', KLF_ACTIVATE or KLF_SETFORPROCESS) = 0 then
RaiseLastOSError;
end;

关于delphi - 如何在后台线程中使用LoadKeyboardLayout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13785090/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com