他のプロセスのキーボードレイアウトを変更する
-
06-07-2019 - |
質問
バックグラウンドで実行され、ユーザーがホットキーを使用してアクティブウィンドウのキーボードレイアウトを切り替えることができるプログラムをC#で記述しています。 (Windowsは CTRL + SHIFT および ALT + SHIFT のみをサポートしています)
RegisterHotKeyを使用してホットキーをキャッチしていますが、正常に機能しています。
問題は、フォーカスされたウィンドウのキーボードレイアウトを変更するAPIが見つからないことです。
ActivateKeyboardLayoutおよびLoadKeyboardLayoutは、呼び出しスレッドのキーボードレイアウトのみを変更できます。
別のスレッドのキーボードレイアウトを変更する方法(言語バーの方法)を知っている人はいますか?
解決
自分だけのために何かを書いている場合に受け入れられる別の方法:すべてのレイアウト(Alt + Shift + 1など)に個別のキーの組み合わせを定義し、 SendInput で切り替えます。
これを使用できる状況はもちろん限られています。
他のヒント
PostMessage(handle,
WM_INPUTLANGCHANGEREQUEST,
0,
LoadKeyboardLayout( StrCopy(Layout,'00000419'), KLF_ACTIVATE)
);
トリックは、キーボードレイアウトを変更するスレッドのコンテキストでコードを実行することだと思います。ここでwin32の相互運用を行い、DLLインジェクションについて学習して、コードをリモートスレッドで実行する必要があります。
A キーボードフックハンドラここであなたのための良いオプション。
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;
所属していません StackOverflow