Dans une application, j'utilise un clavier à l'écran (OSK) pour quand il s'exécute sur une tablette. Nous avons fait une classe appelée OSK qui possède une méthode de spectacle et de masque.
Lorsque l'utilisateur appuie sur "Entrée" sur le clavier à l'écran, le système OSK se cache. Le problème est que lorsque l'utilisateur ferme l'OSK avec le bouton Fermer (X). L'OSK se cache, mais certaines choses doivent changer dans l'interface utilisateur lorsque cela se produit. P>
Y a-t-il un moyen (un événement ou quelque chose comme ça) pour savoir lorsque l'utilisateur appuie le bouton de fermeture de l'OSK? P>
Je montrerai une partie du code que j'ai utilisé pour montrer et cacher l'OSK. Le code montré est en oxygène (mais cela ressemble beaucoup à C #, je pense) p>
Nous avons d'abord quelques DLLIMPORTS: P>
class method OSK._timer_Tick(sender: Object; e: EventArgs); begin var oskWindow := FindWindow("IPTip_Main_Window", nil); var IsOSKOpen := IsWindowVisible(oskWindow); if not _firstShown then begin if IsOSKOpen then _firstShown := true; exit; end; if not IsOSKOpen then begin OSKClosed(nil,new EventArgs()); _timer.Stop(); _firstShown := false; end; end;
4 Réponses :
Pour être honnête, je ne connais pas l'oxygène, mais cela ressemble à Pascal pour .NET :)
Étant donné que votre programme commence l'OSK lui-même, vous pouvez simplement vous abonner au processus.exited code>
événement qui sera appelé lorsque l'utilisateur Ferme l'OSK. P>
donc, faites p code> une variable globale et abonnez-vous à
Exempé code> p>
HwndSource textHandle = (HwndSource)PresentationSource.FromVisual(wpfTextBox);
tip = new TextInputPanel();
tip.AttachedEditWindow = textHandle.Handle;
tip.InPlaceVisibleOnFocus = true;
tip.DefaultInPlaceState = InPlaceState.Expanded;
Je ne possède pas un système Domotech :-) ... Je ne peux pas utiliser P.MainWindowWhandle Obtenir cette exception (impossible d'appeler des membres de l'instance sur des types) (Suis toujours expérimenter avec l'événement excepté)
J'ai défini P.Enabléraférapants à vrai et se débarrasser de la déclaration en utilisant P: = nouveau processus. Maintenant, _OSK_exited est déclenché immédiatement après la méthode Afficher (pas lorsque l'utilisateur appuie sur le bouton (x) Fermer sur le OSK.
Pour être plus précis, _OSK_exited est déclenché après P.Start ()
La méthode de ClosemainWindow () ne fonctionne pas pour les fichiers OnCreenKeyboard (C: \ Program Files \ Fichiers communs \ Microsoft partagé \ Ink \ tabtip.exe) Il fonctionne pour le bloc-notes. On dirait que l'OSK (Taptip.exe) a un comportement différent.
Merci pour la mise à jour, mais TextInputPanel ne semble que travailler avec Winforms, je travaille avec WPF
Voila. Mis à jour pour WPF. Une autre option consiste à utiliser l'objet COM directement au lieu de l'assemblage Microsoft.ink CODE>, vous pouvez créer un seul
ITextInputPanel CODE> et attribuer plusieurs boîtes à mémoire de texte.
Le code construit des courses et tout cela, mais rien ne se passe. Je vais expérimenter un peu plus les prochains jours, pour le moment, je dois terminer un autre travail, Thanx pour toutes les réponses.
Ok bien, je peux vous assurer que cela fonctionne sur Windows 7 ici. J'ai créé un nouveau projet WPF et a glissé une seule zone de texte sur le formulaire. Le code WPF dans ma réponse va dans le gestionnaire window_worked code>.
a finalement trouvé une solution à mon problème à l'aide du registre. L'OSK utilise un registre d'entreprise appelée userclosed. Si l'utilisateur ferme l'OSK, la clé de registre des clos utilise l'une.
La première chose à faire est de définir cette clé de registre sur 0 (dans APP.XAML.CS Remplacer OnStartup) P>
class method OSK._timer_Tick(sender: Object; e: EventArgs); begin var regKeyUserClosed := Registry.CurrentUser.OpenSubKey("Software\Microsoft\TabletTip\1.7",true); var UserClosed := Convert.ToInt32(regKeyUserClosed.GetValue("UserClosed")); if UserClosed.Equals(1) then begin OSKClosed(nil,new EventArgs()); _timer.Stop(); regKeyUserClosed.SetValue("UserClosed",0); end; end;
Vous ne devriez pas utiliser tous ces hacks car OSK est une fonctionnalité intégrée pour Windows 7 et 8. Vous devez utiliser l'API Microsoft Ink pour cela.
Comment avez-vous même compris cela ?! Je cherche une fonctionnalité très similaire, mais malheureusement, cela n'a pas fonctionné.
Découvrez que cette solution a de nombreux problèmes, travaillé ici mais pas dans les États et de nombreux autres problèmes. Nous n'avons pas encore trouvé de solution appropriée. Ce problème n'est pas très urgent ici car la fonctionnalité tactile est une faible priorité pour le moment.
Vous pouvez commencer une minuterie lorsque le processus commence OSK. Sur cette minuterie, vous pouvez vérifier p>
var oskprocess = processus.getprocessesbyname ("OSK"); P>
quand oskprocess.length = 0 p>
Alors il n'y a pas d'OSK en cours d'exécution. Ensuite, vous pouvez arrêter la minuterie p>
En arrière, j'ai écrit du code qui a utilisé Taskkill pour mettre fin à osk.exe ne fonctionnera plus dans Windows10, mais quand je l'ai écrit, je pense que j'utilisais Windows8 Cela a été fait dans le traitement (Java) mais ce maïchelp ???
launch(new String[] {"c:/Windows/system32/osk.exe" }); // OSK open launch(new String[] {"taskkill /IM osk.exe"}); // OSK close