Comment contrôler le panneau de saisie de texte par programmation (TabTip.exe) dans Windows Vista / 7
Je suis l'adaptation d'une application pour l'écran tactile de l'interface et nous voulons utiliser la tablette de saisie de texte du panneau inclus dans Windows Vista/7, en particulier de son clavier. Je veux montrer et cacher comme approprié pour mon application. Fondamentalement, je veux ShowKeyboard()
et HideKeyboard()
fonctions. Quel est le meilleur moyen de contrôler cela?
J'ai regardé la ITextInputPanel API, mais j'ai été incapable de contrôler le clavier directement avec elle (peut-être que j'ai raté quelque chose?). J'ai aussi essayé en vain d'envoyer des messages de fenêtre à sa fenêtre.
L'application est écrite en C++/MFC.
Tous les pointeurs sont grandement appréciés.
source d'informationauteur Yngve Hammersland
Vous devez vous connecter pour publier un commentaire.
J'ai résolu le problème. Il s'avère que Spy++ est vraiment un programmeurs Windows meilleur ami.
Tout d'abord, la classe de la fenêtre du panneau de saisie de la fenêtre qui s'avère être "IPTip_Main_Window". Je l'utilise pour obtenir le handle de fenêtre comme ceci:
Il s'avère que je peux juste poster le même WM_COMMAND messages que son propre menu est de l'envoi. La plupart des opérations sont disponibles depuis le menu: dock haut, le dock en bas et de flotter. Le code pour l'envoi de ces messages sont les suivants:
où X est 10021 pour le dock en bas, 10023 pour le dock en haut et en 10020 pour les variables. Le 0 dans le mot de poids fort indique que le message est envoyé à partir d'un menu.
Enfin, je voulais être en mesure d'afficher et de masquer le panneau de saisie. J'ai remarqué que j'ai pu me mettre sur un bureau de la bande, qui contient uniquement un seul bouton pour activer la visibilité du panneau de saisie. Spy++ing sur les messages publiés à partir de ce bouton a révélé qu'il envoie un mondial enregistré fenêtre de message qui est nommé "TabletInputPanelDeskBandClicked".
L'envoi de ce message au panneau d'entrée provoque la bascule de sa visibilité.
La HideKeyboard() la fonction ressemble maintenant à ceci:
ShowWindow() la fonction est implémentée de la même façon, mais il va également commencer le clavier si elle n'est pas en cours d'exécution.
Mise à jour:
Il semble que cette inter-processus de messagerie est rejetée dans Windows Vista/7. Lors de l'exécution de cette commande dans un non-processus élevés, elle échouera avec "accès refusé". Ma conjecture est que cela est causé par de l'Interface Utilisateur de l'Isolation des Processus (UIPI) la protection de Windows Vista/7. Depuis le Panneau de Saisie Tablet PC est en cours d'exécution comme un processus enfant de un service il a un plus haut niveau d'intégrité que les programmes de l'utilisateur et ne peut donc pas être envoyé par un (ou un ensemble très limité de) messages.
Mise à jour:
Il s'avère que le Panneau de Saisie Tablet PC est en effet en cours d'exécution dans le haut niveau d'intégrité, alors que le processus a commencé par un compte d'utilisateur limité est moyen niveau d'intégrité.
Pour Windows 8:
Remarque: tout comme pour le Windows 7 solution, cela nécessite un processus élevés.
Le panneau de saisie n'est pas un descendant de HWND_DESKTOP. (C'est probablement une sorte de Métro de la fenêtre.) Afin d'obtenir le handle de fenêtre, de faire une série de balayages horizontaux dans un grille-comme le modèle de test avec WindowFromPoint(). Pour chaque test, vérification de la classe de fenêtre de la fenêtre mère pour voir si elle est "IPTip_Main_Window".
Pour afficher le panneau de saisie, lancement
"C:\\Program Files\\Common Files\\microsoft shared\\ink\\tabtip.exe"
. Afin de déterminer si elle est déjà en mode ancré, lire la clé de registre:Une valeur de 0 indique que le panneau de saisie est flottante. Si c'était le cas, on affiche le message suivant pour basculer l'état ancré:
Pour masquer le clavier, post le suivant: