16

バックグラウンドで実行され、ユーザーがホットキーを使用してアクティブなウィンドウのキーボード レイアウトを切り替えることができるプログラムを C# で作成しています。(Windows はCTRL+SHIFTALT+のみをサポートしますSHIFT)

ホットキーをキャッチするために RegisterHotKey を使用していますが、問題なく動作しています。

問題は、フォーカスされたウィンドウのキーボード レイアウトを変更する API が見つからないことです。

ActivateKeyboardLayout と LoadKeyboardLayout は、呼び出しスレッドのキーボード レイアウトのみを変更できます。

別のスレッドのキーボード レイアウトを変更する方法を知っている人はいますか (言語バーのように)。

4

4 に答える 4

8
PostMessage(handle, 
    WM_INPUTLANGCHANGEREQUEST, 
    0, 
    LoadKeyboardLayout( StrCopy(Layout,'00000419'), KLF_ACTIVATE)
);
于 2010-04-22T13:12:39.543 に答える
2

トリックは、キーボードレイアウトを変更したいスレッドのコンテキストでコードを実行することだと思います。ここで win32 相互運用を実行し、DLL インジェクションについて学習して、コードをリモート スレッドで実行する必要があります。

ここでは、キーボード フック ハンドラーが適切なオプションのように見えます。

http://www.codeproject.com/KB/threads/winspy.aspxを ご覧ください。

于 2008-11-05T19:33:39.603 に答える
0

自分用に何かを書いている場合に受け入れられる別の方法: すべてのレイアウト (Alt+Shift+1 など) に個別のキーの組み合わせを定義し、SendInputを使用してそれらを切り替えます。

もちろん使える場面は限られます。

于 2009-02-09T16:35:51.897 に答える
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;
于 2010-04-22T13:16:24.187 に答える