문제

C#에서 백그라운드에서 실행되는 프로그램을 작성하고 사용자가 핫키를 사용하여 활성 창에서 키보드 레이아웃을 전환 할 수 있습니다. (Windows는 지원합니다 CTRL 키+옮기다 그리고 대체+옮기다)

나는 hotkey를 잡기 위해 RegisterHotkey를 사용하고 있으며 잘 작동합니다.

문제는 집중 창에 대한 키보드 레이아웃을 변경할 API를 찾을 수 없다는 것입니다.

ActiveKeyboardLayout 및 LoadKeyboardLayout은 호출 스레드의 키보드 레이아웃 만 변경할 수 있습니다.

다른 스레드에 대한 키보드 레이아웃을 변경하는 방법을 아는 사람이 있습니까 (언어 막대의 방식)가 있습니까?

도움이 되었습니까?

해결책

직접 무언가를 쓰는 경우 수용 할 수있는 또 다른 방법 : 모든 레이아웃 (Alt+Shift+1 등)에 대해 별도의 키 조합을 정의하고 사용하십시오. SendInput 그들 사이를 전환합니다.

이것이 사용할 수있는 상황은 물론 제한적입니다.

다른 팁

PostMessage(handle, 
    WM_INPUTLANGCHANGEREQUEST, 
    0, 
    LoadKeyboardLayout( StrCopy(Layout,'00000419'), KLF_ACTIVATE)
);

트릭은 키보드 레이아웃을 변경하려는 스레드의 맥락에서 코드를 실행하는 것입니다. 여기에서 Win32 Interop을 수행하고 원격 스레드에서 코드를 실행하려면 DLL 주입에 대해 알아야합니다.

키보드 후크 핸들러 여기에서 좋은 옵션 인 것 같습니다.

보세요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