2012-12-09 28 views
10

Tôi đang sử dụng LoadKeyboardLayout chức năng để nạp và kích hoạt bố trí bàn phím theo cách này:Làm thế nào để sử dụng LoadKeyboardLayout trong một chủ đề nền?

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

Nó hoạt động hoàn hảo, nhưng nó bị đóng băng các hình thức hoạt động trong 1-2 giây, vì sự thay đổi này mất một thời gian. Để ngăn chặn điều này, tôi đã chuyển mã này vào một sợi nền như thế này:

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; 

sợi nền này tôi sau đó chạy theo cách này:

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; 

Vấn đề là, rằng nó doesn' t thay đổi bố trí bàn phím như mong đợi. Tôi đã gỡ lỗi mã và tất cả các dòng đã bị loại bỏ; chỉ chức năng LoadKeyboardLayout đã không thực hiện được công việc của mình.

Làm cách nào để tôi có thể thực hiện chức năng LoadKeyboardLayout từ chuỗi nền?

Trả lời

8

Trước hết, bạn nên kiểm tra kết quả của hàm LoadKeyboardLayout và nếu không thành công, bạn nên kiểm tra lỗi được trả về bởi hàm GetLastError để xác định điều gì là sai.

Nhưng ngay cả khi chức năng này gọi thành công, nó sẽ kích hoạt mã định danh miền địa phương đầu vào, nhưng cho chuỗi công nhân của bạn. Khi LoadKeyboardLayout bang tham chiếu cho KLF_ACTIVATE cờ (nhấn mạnh của tôi):

KLF_ACTIVATE

Nếu nhận dạng locale đầu vào quy định chưa được nạp, hàm tải và kích hoạt nhận dạng locale đầu vào cho chủ đề hiện tại.


Mặc dù, nếu bạn muốn tải và kích hoạt bố trí bàn phím cho toàn bộ quá trình, bạn có thể cố gắng kết hợp các KLF_ACTIVATE cờ với KLF_SETFORPROCESS một:

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

Cảm ơn, tôi nên đoán! làm thế nào tôi có thể sửa lỗi này? –

+0

Tôi đã được kiểm tra kết quả, và nó không bao giờ trả về NUL. làm thế nào tôi có thể áp dụng chức năng này để kiểm soát hoạt động (như một TEDit)? –

+1

Nếu bạn định thay đổi bố trí bàn phím cho quy trình (những gì tôi đoán bạn làm, chuỗi công nhân bạn đã sử dụng vì phải mất một thời gian dài, phải không?), Hãy thử kết hợp cờ 'KLF_ACTIVATE' với 'KLF_SETFORPROCESS'. – TLama

Các vấn đề liên quan