2008-11-04 10 views
13

Ich schreibe ein Programm in C#, das im Hintergrund ausgeführt wird und Benutzern die Verwendung eines Hotkeys ermöglicht, um Tastaturlayouts im aktiven Fenster zu wechseln. (Windows unterstützt nur CTRL +SHIFT und ALT +SHIFT)Ändern des Tastaturlayouts für andere Prozesse

ich RegisterHotKey bin mit dem Hotkey zu fangen, und es funktioniert gut.

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

ActivateKeyboardLayout und LoadKeyboardLayout können nur das Tastaturlayout für den aufrufenden Thread ändern.

Kann jemand das Tastaturlayout für einen anderen Thread ändern (wie die Sprachleiste)?

+0

Wenn Sie Sprachen mit einem Windows-builtin Hotkey wechseln, ist es nicht anders Fäden beeinflussen, nicht wahr? – JXG

+0

pro Thread Tastaturlayout wechseln? Im Gegensatz zum systemweiten Layoutwechsel? Etwas mit Akkorden machen? – jcolebrand

+0

@drachenstern: Es gibt keine systemweite Tastaturlayoutschaltung; Das aktive Tastaturlayout ist ein Status pro UI-Thread. Ich versuche, Alt + Shift zu ersetzen, damit ich es nicht versehentlich drücke, also ist das Chording keine Option (wenn ich verstehe, was du meinst). – SLaks

Antwort

1

andere Möglichkeit, dass, wenn Sie für sich selbst schreiben, nur etwas akzeptabel sein kann: eine separate Tastenkombination für jedes Layout definieren (wie Alt + Umschalt + 1, usw.) und Verwenden Sie SendInput, um zwischen ihnen zu wechseln.

Die Umstände, unter denen dies nutzbar ist, sind natürlich begrenzt.

2

Ich denke, der Trick besteht darin, Ihren Code im Kontext des Threads auszuführen, dessen Tastaturlayout Sie ändern möchten. Sie müssen hier ein Win32-Interop durchführen und etwas über DLL Injection lernen, damit Ihr Code im Remote-Thread ausgeführt wird.

Eine keyboard hook handler sieht wie eine gute Option für Sie hier aus.

Werfen Sie einen Blick auf http://www.codeproject.com/KB/threads/winspy.aspx

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

Dies funktioniert perfekt mit 'GetForegroundWindow' für den' Griff'. Eine Ausnahme sind WPF-Programme, die als Reaktion auf diese Nachricht blockiert scheinen. –

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; 
+0

Dies funktioniert nicht über Prozesse, wenn ich mich richtig erinnere. – SLaks

Verwandte Themen