Question

J'écris un programme en C # qui s'exécute en arrière-plan et permet aux utilisateurs d'utiliser un raccourci clavier pour changer la disposition du clavier dans la fenêtre active. (Windows prend uniquement en charge les CTRL + SHIFT et ALT + SHIFT )

J'utilise RegisterHotKey pour saisir le raccourci clavier, et tout fonctionne correctement.

Le problème est que je ne trouve aucune API permettant de modifier la disposition du clavier pour la fenêtre ciblée.

ActivateKeyboardLayout et LoadKeyboardLayout peuvent uniquement modifier la disposition du clavier pour le thread appelant.

Quelqu'un sait-il comment changer la disposition du clavier pour un fil différent (comme le fait la barre de langue)?

Était-ce utile?

La solution

Une autre façon qui peut être acceptable si vous écrivez quelque chose juste pour vous-même: définissez une combinaison de touches distincte pour chaque mise en page (telle que Alt + Maj + 1, etc.) et utilisez SendInput pour basculer entre eux.

Les circonstances dans lesquelles cela est utilisable sont bien sûr limitées.

Autres conseils

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

Je pense que l’astuce consiste à exécuter votre code dans le contexte du thread dont vous souhaitez modifier la disposition du clavier. Vous aurez besoin de faire une certaine interopérabilité win32 ici et de vous renseigner sur l’injection de DLL pour que votre code soit exécuté dans le thread distant.

Un gestionnaire des raccourcis du clavier est le suivant: une bonne option pour vous ici.

Regardez 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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top