我正在用C#編寫一個程序,該程序在後臺運行,並允許用戶使用熱鍵在活動窗口中切換鍵盤佈局。 (僅適用於Windows支持CTRL + SHIFT 和 ALT + SHIFT )更改其他進程的鍵盤佈局
我使用RegisterHotKey趕熱鍵,並且它的正常工作。
問題是我找不到任何API來更改焦點窗口的鍵盤佈局。
ActivateKeyboardLayout和LoadKeyboardLayout只能更改調用線程的鍵盤佈局。
有誰知道如何更改不同線程的鍵盤佈局(語言欄的方式)?
我正在用C#編寫一個程序,該程序在後臺運行,並允許用戶使用熱鍵在活動窗口中切換鍵盤佈局。 (僅適用於Windows支持CTRL + SHIFT 和 ALT + SHIFT )更改其他進程的鍵盤佈局
我使用RegisterHotKey趕熱鍵,並且它的正常工作。
問題是我找不到任何API來更改焦點窗口的鍵盤佈局。
ActivateKeyboardLayout和LoadKeyboardLayout只能更改調用線程的鍵盤佈局。
有誰知道如何更改不同線程的鍵盤佈局(語言欄的方式)?
另一種方式可能是,如果你正在寫只是爲了自己的東西可以接受的:定義一個單獨的按鍵組合爲每個佈局(如ALT + SHIFT + 1等),和使用SendInput在它們之間切換。
這是可用的情況當然是有限的。
我認爲訣竅就是讓你的代碼在你希望改變鍵盤佈局的線程上下文中執行。您需要在這裏執行一些win32 interop並瞭解DLL注入以讓您的代碼在遠程線程中執行。
A keyboard hook handler在這裏看起來是個不錯的選擇。
PostMessage(handle,
WM_INPUTLANGCHANGEREQUEST,
0,
LoadKeyboardLayout(StrCopy(Layout,'00000419'), KLF_ACTIVATE)
);
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;
當您使用Windows的內置熱鍵切換語言,它不會影響不同的線程,不是嗎?每線程鍵盤佈局切換 – JXG 2008-11-05 15:12:58
?與全系統佈局切換相反?用chording做什麼? – jcolebrand 2010-11-01 17:13:45
@drachenstern:沒有系統範圍內的鍵盤佈局切換;活動鍵盤佈局是每個UI線程狀態。我正在嘗試替換Alt + Shift,這樣我就不會意外按下它,所以chording不是一個選項(如果我理解你的意思)。 – SLaks 2010-11-01 17:21:40