Sto utilizzando la funzione LoadKeyboardLayout per caricare e attivare il layout di tastiera in questo modo:Come utilizzare LoadKeyboardLayout in un thread in background?
procedure TfrmMain.eSearchEnter(Sender: TObject);
begin
LoadKeyboardLayout('00000429', KLF_ACTIVATE);
end;
Funziona perfettamente, ma blocca la forma attiva per 1-2 secondi, dal momento che questo cambiamento richiede un certo tempo. Per prevenire questo, ho spostato il codice a un thread in background come questo:
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;
Questo thread in background sto poi eseguire in questo modo:
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;
Il problema è, che doesn' t cambia il layout della tastiera come previsto. Ho eseguito il debug del codice e sono state aggiunte tutte le righe; solo la funzione LoadKeyboardLayout non ha fatto il suo lavoro.
Come posso far funzionare la funzione LoadKeyboardLayout da un thread in background?
Grazie, dovrei indovinare! come posso risolvere questo? –
Sono stato controllato il risultato e non restituisce mai NUL. come posso applicare questa funzione al controllo attivo (come un TEdit)? –
Se hai intenzione di cambiare il layout della tastiera per il processo (cosa penso che fai, il thread di lavoro che hai usato da quando ci vuole molto tempo, non è vero?), Prova a combinare la bandiera 'KLF_ACTIVATE' con la funzione 'KLF_SETFORPROCESS'. – TLama