Ce à quoi vous faites face est un comportement "normal" mais ridiculement stupide de Windows avec des périphériques d'entrée tactile. Nous sommes confrontés au même problème depuis un certain temps et nous essayons de le résoudre activement depuis quelques semaines. L'astuce est, que Windows gère le périphérique d'entrée tactile comme "souris, qui peut être entièrement contrôlée avec un seul doigt". Par conséquent, il a plusieurs états, plus que des événements:
Les événements sont: Appuyez sur commencer (bas), déplacer, haut, clic droit, et si vous voulez vraiment vous inscrire à un rappel, vous deviendrez stationnaire (pas déplacé depuis dernier rapport mais toujours en panne).
En attendant, il y a plus d'états. Tout d'abord, lorsque vous appuyez sur votre doigt, il détecte en interne "Touch down!" un événement. Il attend un certain laps de temps (qui peut ou non être disponible pour changer de bidule, dépend des pilotes etc ...), pour déterminer si ce que vous vouliez était un clic droit (après x temps, après la sortie ! avant l'heure Y!il se déclenchera clic droit événement) ou s'il s'agissait d'un clic gauche vers le bas (événement déclencheur TouchBegin - après et le temps, qui est plus long que x-temps, et après l'expire, il tirera événement vers le bas gauche (cliquez pas!)).
En attendant, si le premier contact est interrompu par un mouvement ou - !! en attendant x temps pour expirer !! la libération du doigt avant que le temps x est manqué, il déclenchera automatiquement gauche vers le bas(sur le mouvement) ou clic gauche(sur la libération). La même chose s'applique à tout moment après l'expiration du temps Y, ou MOVE est déclenché.
Pour plus simplement et compréhensible, je vais essayer de donner un exemple:
Disons que vous avez appareil tactile, et les horaires sont les suivants: Le point B commence, positionné à 0 secondes de notre calendrier. Le point X est le premier point d'arrêt de déclenchement, positionné à 5 secondes de notre timeline. Le point Y est le deuxième point d'arrêt de déclenchement, positionné à 10 secondes de notre chronologie.
Vous mettez votre doigt sur le contact, et cela commence la chronologie. Scénarios possibles: - Vous le relâchez à tout moment avant le point X -> Clic gauche est déclenché (événements Touch down et up, dans l'ordre l'un après l'autre) - Vous le relâchez après le point X mais avant le point Y -> clic droit est déclenché (Appuyez sur les événements vers le bas et vers le haut, avec un clic droit) - Vous atteignez le point Y - Gauche est déclenché! - Vous le relâchez après le point Y à tout moment, peu importe si le mouvement se déclenche entre la libération ou non (mais le mouvement n'est PAS déclenché avant d'atteindre ce point dans le scénario) -> Left up est déclenché.
- événement move Vous déclencheur (faire) avant d'atteindre le point X -> gauche vers le bas est déclenchée, suivie par autant d'événements de mouvement comme il le détecte, jusqu'à ce que vous relâchez -> puis à gauche est déclenchée
- Vous déclencher (faire) déplacer l'événement après X mais avant Y -> même que ci-dessus!
- Vous atteignez le point Y et le déplacez ensuite -> vérifiez le point n ° 4 ci-dessus.
Espérons que cela a du sens pour vous.
Maintenant, pour aller aux solutions possibles: le pilote personnalisé serait une option, mais nous ne sommes pas encore là, donc nous essayons toujours d'autres options. Le plus prometteur pour l'instant semble être l'utilisation de RAW_INPUT et Touch hooks, on dirait que nous devrons les combiner pour obtenir ce que nous voulons. Le bon côté est que les fenêtres elles-mêmes détectent lorsque le doigt touche l'appareil, indépendamment des timings et des événements qu'il veut détecter, déterminer et transmettre aux applications, mais pour une raison quelconque, il est difficile à utiliser dans une telle nature. Comme preuve, vous pouvez simplement vérifier le point transparent qui apparaît sous votre doigt le premier moment où vous touchez l'écran.
Pendant ce temps, Android gère ces choses beaucoup mieux ...
espère que cela aide, et je suis heureux de venir autour de la solution complète une fois que nous venons à travers et obtenir quelque chose assez bon pour l'utilisation.
M.*
Que diriez-vous juste d'activer une minuterie avec un intervalle de 1000ms quand MouseDown se produit, et l'annuler sur MouseUp. Mettez votre code dans l'événement OnTimer. Il devrait seulement tirer après avoir maintenu la souris pendant plus d'une seconde. Vous pourriez probablement vous en sortir avec une minuterie pour l'ensemble du formulaire tant que vous enregistrez le contrôle qui l'a lancé. N'oubliez pas de désactiver la minuterie immédiatement dans l'événement OnTimer. – penarthur66
Merci, mais cela ne fonctionnera pas pour la même raison que le fil anonyme, le MouseDown ne se déclenche pas à moins que vous ne bougiez votre doigt ou ne leviez votre doigt. –
Je n'ai pas de tablette Windows, mais j'ai ajouté un TButton et un TMemo à un nouveau formulaire VCL (Berlin) et ajouté du code pour ajouter une ligne au mémo dans les gestionnaires d'événements MouseDown et MouseUp, les deux événements se déclenchent clairement et en synchronisation avec les clics de souris. Il doit y avoir une différence entre la façon dont la tablette déclenche les événements à partir de la souris PC standard. – penarthur66