6
votes

Sur l'événement du clavier de clavier de l'écran?

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;


0 commentaires

4 Réponses :


2
votes

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;


8 commentaires

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 , vous pouvez créer un seul ITextInputPanel 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 .



2
votes

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;


3 commentaires

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.



0
votes

Vous pouvez commencer une minuterie lorsque le processus commence OSK. Sur cette minuterie, vous pouvez vérifier

var oskprocess = processus.getprocessesbyname ("OSK");

quand oskprocess.length = 0

Alors il n'y a pas d'OSK en cours d'exécution. Ensuite, vous pouvez arrêter la minuterie


0 commentaires

0
votes

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


0 commentaires