2012-12-09 21 views
10

Ben yüklemek ve klavye düzenini bu şekilde aktive etmek LoadKeyboardLayout fonksiyonunu kullanıyorum: Mükemmel çalışıyor, ancak bu değişiklik biraz zaman alır çünkü, 1-2 saniye aktif formu donarArka plan iş parçacığında LoadKeyboardLayout nasıl kullanılır?

procedure TfrmMain.eSearchEnter(Sender: TObject); 
begin 
    LoadKeyboardLayout('00000429', KLF_ACTIVATE); 
end; 

. Bu önlenmesi için, böyle bir arka plan iş parçacığı için bu kodu taşıdığınız:

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; 

Sonra bu şekilde çalıştırıyorum Bu arka plan iş parçacığı: Bu kötü kokan o,

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; 

sorundur Klavye düzenini beklendiği gibi değiştirin. Kodu ayıklandım ve tüm satırları exleauted; Sadece LoadKeyboardLayout işlevi işini yapmadı.

LoadKeyboardLayout işlevini arka plan iş parçacığından nasıl çalıştırabilirim?

cevap

8

Her şeyden önce, LoadKeyboardLayout işlevinin sonucunu kontrol etmelisiniz ve eğer başarısız olursa, neyin yanlış olduğunu belirlemek için GetLastError işlevinin döndürdüğü hatayı kontrol etmelisiniz.

Ancak bu işlev çağrısı başarılı olsa bile, giriş yerel ayarını etkinleştirir, ancak çalışan iş parçacığınız için. (Benim vurguladığı) KLF_ACTIVATE bayrak için LoadKeyboardLayout referans devletler gibi:

KLF_ACTIVATE belirtilen giriş yerel ayar tanıtıcısı zaten yüklü değilse

, fonksiyon yükler ve giriş yerel tanımlayıcı aktive geçerli iş parçacığı için.


yüklemek ve tüm süreç için klavye düzenini etkinleştirmek istiyorsanız, olsa da, KLF_SETFORPROCESS biri ile KLF_ACTIVATE bayrak birleştirmeyi deneyebilirsiniz:

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

sayesinde sanırım olmalı! Bunu nasıl düzeltebilirim? –

+0

Sonucu kontrol ettim ve hiçbir zaman NUL değerini döndürmedi. Bu işlevi aktif kontrollere nasıl uygulayabilirim (bir TEdit gibi)? –

+1

Süreç için klavye düzenini değiştirecekseniz (ne yaptığınızı tahmin edersiniz, uzun zamandır kullandığınız iş parçacığı uzun sürüyor, değil mi?), 'KLF_ACTIVATE' bayrağı birleştirmeyi deneyin. KLF_SETFORPROCESS biriyle. – TLama

İlgili konular