web-dev-qa-db-fra.com

Comment utiliser le clavier à l'écran Windows dans C # WinForms

  • VS 2010 
  • Développement d'une application 32 bits fonctionnant sur un système d'exploitation 64 bits (Windows 7, Windows 8 - application de bureau)
  • C #
  • .NET 4.0 
  • WinForms

J'ai trouvé de nombreux sujets lors du lancement du clavier à l'écran Windows (osk.exe) à partir d'une application, mais je rencontre quelques problèmes. Cela semble être dû au fait que j'exécute une application 32 bits sur un système d'exploitation 64 bits. J'ai essayé le code posté par WooCaSh ici: Clavier à l'écran dans WinForms

Mais aucun des trois chemins différents ne fonctionne pour moi. Pour le chemin sysnative, Process.Start échoue avec "Impossible de trouver le chemin spécifié." Pour les chemins system32 et osk.exe, le message d'erreur "Impossible de démarrer le clavier à l'écran".

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

  1. Y a-t-il une manière plus facile ou correcte de faire cela?
  2. J'espérais que l'exécution de mon application sur une tablette lancerait automatiquement le clavier à l'écran lorsque l'utilisateur sélectionne une zone de texte, mais sans succès. Est-ce normal ou est-ce que je manque quelque chose? J'ai constaté que le clavier n'est pas automatiquement lancé dans Windows 8 en mode Bureau (ce que mon application est): http://www.bleepingcomputer.com/forums/t/480250/keyboard-does-not-pop -up-automatiquement/ Apparemment, cela fonctionne sur les tablettes Windows 7, mais je ne peux pas tester car je n'ai que des tablettes Windows 8 ici.
16
Tara

Je lance maintenant le "clavier tactile" par opposition au "clavier à l'écran" (qui est le clavier que je voulais de toute façon sur Windows 8) 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 mes Win7 et Win8, quelle que soit mon application 32 bits sur un système d'exploitation 64 bits. Cependant, j'ai toujours le problème de fermer le clavier par programme lorsque j'ai terminé. Le processus, this.keyboardProc, ne semble pas recevoir le descripteur et a immédiatement la propriété HasExited = true. Cela signifie que mes tentatives pour le fermer ou le tuer échouent.

Selon ce fil de discussion, si l'utilisateur ouvre manuellement le clavier (ou si je le lance par programme), le clavier ne se fermera pas automatiquement si le champ de texte perd le focus: Windows 8 - Comment supprimer le clavier tactile? J'ai essayé la solution de contournement consistant à définir le focus sur un bouton caché, mais depuis que j'ai lancé le clavier moi-même, il ne se ferme pas automatiquement. 

20
Tara

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 fermez tous les claviers avec

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

Pour certaines raisons, onScreenKeyboardProc.Kill () ou .Close () ne fonctionne pas.

10
Panu Horsmalahti

Pour que le clavier s'ouvre automatiquement, les contrôles doivent implémenter certains modèles de contrôle UI Automation, en particulier ITextProvider/IValueProvider. C'est une nuisance, mais cela fonctionne (et c'est une méthode plus simple que de lancer du fichier * .exe)

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/

6
tombam

Le clavier tactile exploite l'automatisation de l'interface utilisateur. Pour des raisons qui me semblent mystérieuses, la zone d’édition standard de Windows n’implémente pas l’interface utilisateur automatique, alors que d’autres contrôles, comme la zone de liste déroulante, le font.


On peut utiliser l'implémentation de l'automatisation de l'interface utilisateur à partir de UIAutomationClient.dll.

Pour que l'automatisation de l'interface utilisateur soit injectée par magie dans une application, il est nécessaire de déclencher l'initialiseur de classe de la classe interne Assembly, UiaCoreApi.

On peut y parvenir, par exemple, en appelant semblant non-op:

AutomationElement.FromHandle(IntPtr)(-1)

Une autre méthode consiste à implémenter explicitement l'interface utilisateur d'automatisation. Pour cela, implémentez les interfaces ITextProvider / IValueProvider pour le contrôle d’entrée respectif.

Pour lier l'implémentation des interfaces au contrôle, gérez message de fenêtre WM_GETOBJECT avec lParam = RootObjectId.

Pour un exemple de mise en œuvre, voir

Il est intéressant de noter que les commandes pour lesquelles le clavier tactile fonctionne immédiatement (comme la zone de liste déroulante ou la boîte de saisie du mot de passe, voir la réponse), n'implémentent pas le WM_GETOBJECT/RootObjectId. Il doit y avoir une autre machine derrière eux.


La "solution" la plus courante à ce problème, qui consiste à faire apparaître le clavier de manière explicite en exécutant TabTip.exe ou osk.exe, n’est guère acceptable.

Si ce n’est rien d’autre, il n’existe aucun moyen propre de masquer le clavier ouvert en exécutant le TabTip.exe (les solutions incluent des astuces telles que la suppression du processus ou l’envoi Esc clé).

Et effectivement, le hack ci-dessus ne semble plus fonctionner dans Windows 10 Anniversary Update: affichez le clavier tactile (TabTip.exe) dans Windows 10 Anniversary edition .

2
Martin Prikryl

Le démarrage de TabTip.exe ne fonctionne plus dans Widnows 10 Anniversary Edition. J'ai découvert une interface COM non documentée pour contrôler le clavier tactile. Vérifiez le code ici https://stackoverflow.com/a/40921638/332528

0
torvin