2008-11-04 75 views
13

我正在用C#編寫一個程序,該程序在後臺運行,並允許用戶使用熱鍵在活動窗口中切換鍵盤佈局。 (僅適用於Windows支持CTRL + SHIFT ALT + SHIFT 更改其他進程的鍵盤佈局

我使用RegisterHotKey趕熱鍵,並且它的正常工作。

問題是我找不到任何API來更改焦點窗口的鍵盤佈局。

ActivateKeyboardLayout和LoadKeyboardLayout只能更改調用線程的鍵盤佈局。

有誰知道如何更改不同線程的鍵盤佈局(語言欄的方式)?

+0

當您使用Windows的內置熱鍵切換語言,它不會影響不同的線程,不是嗎?每線程鍵盤佈局切換 – JXG 2008-11-05 15:12:58

+0

?與全系統佈局切換相反?用chording做什麼? – jcolebrand 2010-11-01 17:13:45

+0

@drachenstern:沒有系統範圍內的鍵盤佈局切換;活動鍵盤佈局是每個UI線程狀態。我正在嘗試替換Alt + Shift,這樣我就不會意外按下它,所以chording不是一個選項(如果我理解你的意思)。 – SLaks 2010-11-01 17:21:40

回答

1

另一種方式可能是,如果你正在寫只是爲了自己的東西可以接受的:定義一個單獨的按鍵組合爲每個佈局(如ALT + SHIFT + 1等),和使用SendInput在它們之間切換。

這是可用的情況當然是有限的。

8
PostMessage(handle, 
    WM_INPUTLANGCHANGEREQUEST, 
    0, 
    LoadKeyboardLayout(StrCopy(Layout,'00000419'), KLF_ACTIVATE) 
); 
0
function ChangeRemoteWndKeyboardLayoutToRussian(
    const RemoteHandle: THandle): Boolean; 
    var 
    Dumme: DWORD; 
    Layout: HKL; 
    begin 
    Layout := LoadKeyboardLayout('00000419', KLF_ACTIVATE); 
    Result := SendMessageTimeOut(RemoteHandle, WM_INPUTLANGCHANGEREQUEST, 
     0, Layout, SMTO_ABORTIFHUNG, 200, Dumme) <> 0; 
    if Result then  
     Result := SendMessageTimeOut(RemoteHandle, WM_INPUTLANGCHANGEREQUEST, 
     RUSSIAN_CHARSET, Layout, SMTO_ABORTIFHUNG, 200, Dumme) <> 0; 
    end;