Frage

Ich bin ein Programm in C # zu schreiben, die im Hintergrund läuft und ermöglicht es Benutzern, einen Hotkey zu verwenden Tastaturlayouts im aktiven Fenster zu wechseln. (Windows unterstützt nur STRG + SHIFT und ALT + SHIFT )

Ich verwende RegisterHotKey den Hotkey zu fangen, und es funktioniert gut.

Das Problem ist, dass ich keine API finden Sie das Tastaturlayout für die fokussierte Fenster zu ändern.

ActivateKeyBoardLayout und LoadKeyboardLayout kann nur das Tastaturlayout für den anrufenden Thread ändern.

Wer weiß, wie das Tastaturlayout für einen anderen Thread zu ändern (die Art und Weise der Sprache Bar tut)?

War es hilfreich?

Lösung

Eine andere Möglichkeit, die akzeptabel sein kann, wenn man etwas nur für sich selbst schreiben: definieren eine separate Tastenkombination für jedes Layout (wie Alt + Umschalt + 1, usw.), und verwenden Sie Send zwischen ihnen wechseln.

Die Umstände, unter denen diese verwendbar ist, sind begrenzt, natürlich.

Andere Tipps

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

Ich denke, der Trick Ihren Code zu erhalten ist, ändern im Kontext des Themas, dessen Tastaturlayout Sie möchten auszuführen. Sie müssen einige win32 Interop hier und erfahren Sie mehr über DLL Injection tun, um Ihren Code zu bekommen in dem Remote-Thread ausgeführt.

Tastatur-Hook-Handler sieht aus wie eine gute Option für Sie hier.

Hier finden Sie aktuelle 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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top