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/
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.
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.
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/
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 .
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