Comment utiliser Windows sur le clavier de L'écran dans C # WinForms

  • VS 2010
  • développement D'une application 32 bits qui fonctionne sur OS 64 bits (Win7, Win8-Desktop app)
  • c#
  • .NET 4.0
  • WinForms

j'ai trouvé de nombreux threads lors du lancement du clavier Windows on-screen (osk.exe) d'une application, mais j'ai quelques problèmes. Il semble que ce soit parce que j'exécute une application 32-bit sur un OS 64-bit. J'ai essayé le code posté par WooCaSh ici: clavier à l'écran dans WinForms

mais aucune des trois voies différentes ne fonctionne pour moi. Pour le "sysnative" chemin d'accès, Processus.Start " ne peut pas trouver le chemin spécifié."Pour le system32 et osk.exe chemins, j'ai "impossible de démarrer le clavier à l'écran" dialogue d'erreur.

j'ai trouvé une solution possible ici, qui est un peu plus compliquée que ce que je cherchais (post by eryang): http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/10ebc62f-e6d7-4072-9fd1-ea3784a0966f/

  1. y a-t-il une façon plus facile ou correcte de le faire?
  2. j'espérais que l'exécution de mon application sur une tablette de lancer automatiquement le clavier à l'écran lorsque l'utilisateur sélectionne une zone de texte, mais pas de chance. C'est normal ou je rate quelque chose? EDIT : trouve que le clavier n'est pas lancement automatique dans Win8 en mode Bureau (mon application): http://www.bleepingcomputer.com/forums/t/480250/keyboard-does-not-pop-up-automatically / apparemment cela fonctionne sur les comprimés de Win7, mais je ne peux pas tester parce que je n'ai que des comprimés de Win8 ici.
13
demandé sur Community 2013-03-21 21:58:10

5 réponses

je lance maintenant le "clavier tactile" par opposition au "clavier sur L'écran" (qui est le clavier que je voulais sur Windows 8 de toute façon) avec:

string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
string keyboardPath = Path.Combine(progFiles, "TabTip.exe");

this.keyboardProc = Process.Start(keyboardPath);

cela fonctionne sur mon Win7 et Win8, indépendamment de mon application 32 bits sur OS 64 bits. Cependant, j'ai encore le problème de fermer le clavier par programmation quand j'ai fini. Le processus, ce.keyboardProc, ne semble pas obtenir la poignée, et a immédiatement propriété HasExited = true. Cela signifie que mes efforts pour fermer ou de le tuer échouer.

selon ce fil, si l'utilisateur ouvre manuellement le clavier (ou que je le lance programmatiquement), le clavier ne se fermera pas/ne se cachera pas automatiquement lorsque le champ de texte perd sa mise au point: Windows 8 - Comment rejeter le clavier tactile? j'ai essayé la solution de contournement de mettre la mise au point à un bouton caché, mais depuis que j'ai lancé le clavier moi-même, il ne se ferme pas automatiquement.

21
répondu Tara 2017-05-23 10:31:31

j'ai eu du mal à fermer le clavier à l'écran. Vous pouvez démarrer le clavier tactile avec

        string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
        string onScreenKeyboardPath = System.IO.Path.Combine(progFiles, "TabTip.exe");
        onScreenKeyboardProc = System.Diagnostics.Process.Start(onScreenKeyboardPath);

et fermer tous les claviers avec

            //Kill all on screen keyboards
            Process[] oskProcessArray = Process.GetProcessesByName("TabTip");
            foreach (Process onscreenProcess in oskProcessArray)
            {
                onscreenProcess.Kill();
            }

Pour une raison quelconque onScreenKeyboardProc.Kill () or .Close() ne fonctionne pas.

12
répondu Panu Horsmalahti 2013-07-31 09:09:42

pour que le clavier s'ouvre automatiquement, les commandes doivent mettre en œuvre certains modèles de contrôle D'automatisation de L'IU, en particulier ITextProvider/IValueProvider. C'est une nuisance, mais ça marche (et c'est une façon plus propre que de lancer *.exe) 151910920"

j'ai écrit un exemple d'application et un court article ici: http://blog.tombam.net/implementing-textbox-with-on-screen-touch-keyboard-part-1 /

4
répondu tombam 2017-05-10 07:27:21

le clavier tactile tire parti de l'automatisation de L'IU. Pour certaines raisons qui sont un mystère pour moi, le Standard Windows edit box n'implémente pas L'UI automatique, tandis que d'autres contrôles, comme combo box, le font.


on peut utiliser la mise en œuvre de L'automatisation de L'UI de UIAutomationClient.dll .

pour l'automation de L'UI à injecter par magie dans une application, initialiseur de classe de la classe d'assemblage interne UiaCoreApi ont pour être déclenché.

On peut y parvenir par exemple en appelant seeming no-op:

AutomationElement.FromHandle(IntPtr)(-1)

une autre façon consiste à mettre en œuvre l'Automation UI explicitement. Pour cela mettre en œuvre le ITextProvider / IValueProvider interfaces pour le contrôle d'entrée respectif.

pour lier l'implémentation des interfaces à la commande, Gérer "151950920 de la fenêtre" message avec lParam = RootObjectId .

pour un exemple de mise en œuvre, Voir

bien qu'il soit intéressant, les commandes, pour lesquelles le clavier tactile fonctionne out-of-the-box (comme la zone de liste modifiable ou le mot de passe de boîte d'édition, voir la réponse), ne pas mettre en œuvre le WM_GETOBJECT / RootObjectId . Il doit y avoir une autre machine derrière eux.


la "solution" la plus courante à ce problème, de popup explicitement le clavier en exécutant le TabTip.exe ou osk.exe , est difficilement acceptable.

si pour rien d'autre, alors parce qu'il n'y a aucun moyen propre de cacher le clavier ouvert en exécutant le TabTip.exe (solutions comprennent des hacks comme tuer le processus ou envoyer Esc clé).

et en fait le hack ci-dessus ne semble plus fonctionner dans Windows 10 Mise à jour anniversaire: montre clavier tactile (TabTip.exe dans Windows 10 edition Anniversaire .

1
répondu Martin Prikryl 2018-09-19 06:38:33

Starting TabTip.exe ne travaille plus dans Widnows Édition Anniversaire. J'ai découvert une interface COM non documentée pour contrôler le clavier tactile. Vérifier le code ici https://stackoverflow.com/a/40921638/332528

0
répondu torvin 2017-05-23 12:34:43