다른 프로세스의 키보드 레이아웃을 변경하십시오
-
06-07-2019 - |
문제
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 주입에 대해 알아야합니다.
ㅏ 키보드 후크 핸들러 여기에서 좋은 옵션 인 것 같습니다.
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