質問

バックグラウンドで実行され、ユーザーがホットキーを使用してアクティブウィンドウのキーボードレイアウトを切り替えることができるプログラムを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 キーボードフックハンドラここであなたのための良いオプション。

見てみましょう http://www.codeproject.com/KB/threads/winspy.aspx

  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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top