2010-08-17 25 views
2

Si vous vous concentrez sur une zone de texte mais que le curseur de souris ne pointe pas exactement dessus, le curseur de souris a la forme d'une flèche par défaut ou ce que vous définissez.Comment empêcher le curseur de «sauter» dans la zone de texte lorsque vous tapez

Au moment où vous commencez à taper, le curseur de souris se cache et vous ne voyez que le curseur de type IBeam clignotant dans la zone de texte. Question: Comment maintenir le curseur de souris dans sa position initiale même si vous commencez à taper?

Assez intéressant: cela n'arrive pas dans les applications WPF.

+3

Je dois demander, pourquoi? Habituellement, les gens qui tentent de briser des modèles d'interface utilisateur de base comme celle-ci finissent par faire des applications terriblement inutilisables et ennuyeuses. Peut-être existe-t-il un meilleur moyen d'atteindre votre objectif ultime (non exprimé ici)? – siride

+0

Hmm .. J'avais besoin d'obtenir des données d'un lecteur de carte magnétique. Donc, au moment du balayage, il retourne une très longue chaîne avec un motif différent, et il fonctionne relativement lentement, aussi lent qu'un utilisateur qui tape du texte en utilisant le clavier assez rapidement. Cela prend plus de 4 sec. lire toutes les données du lecteur. J'ai décidé que dès que l'entrée reçoit les premiers caractères, et si cela ressemble à la chaîne du lecteur, je déplace le focus vers une autre zone de texte, techniquement visible mais déplacée en dehors des limites du formulaire. Jusqu'à ce qu'il obtienne le reste de l'entrée, je dois montrer le curseur occupé. – Agzam

Répondre

2

Les gars ... C'était ridiculement facile. En TextBox.KeyDown je dois déplacer le curseur chaque fois au point où il était avant ..

Cursor.Position = new Point(oldX, oldY); 

La seule chose laide ici - si c'est un curseur animé, l'animation commence chaque fois tout recommencer. Et vous ne pouvez pas taper et déplacer la souris en même temps. Que c'est un peu nul, par contre, qui s'en soucie? Les applications Winform ont tendance à être plus laides que celles de WPF, n'est-ce pas?

+0

Appelant ainsi SetCursor(). Et voila. – JustBoo

0

Il s'agit d'un paramètre Windows.

Sous Panneau de configuration, allez à la souris et vous devriez voir un cadre similaire à « Masquer pointeur en tapant »

+0

Même si cette option est désactivée, si le pointeur est positionné sur la zone de texte, il disparaît lorsque l'utilisateur commence à taper. –

+0

Je viens de vérifier et ça ne disparaît pas pour moi. Cela change juste à un "I" clignotant au lieu d'un pointeur. –

+0

Ce qui est exactement le problème de l'OP, si je lis le post droit. –

0

Autant que je sache, il n'y a aucun moyen de le faire. Même après avoir désactivé le paramètre "Hide Pointer While Typing" de Windows, le curseur disparaît s'il est positionné non seulement sur la zone de texte, mais sur le formulaire entier.

Il ne semble pas y avoir quelque chose dans les propriétés du contrôle de zone de texte ou du formulaire qui affecte ce comportement.

+0

Hmm ... peut-être la façon difficile de le faire? Obtenir la position du pointeur de la souris et dans l'événement TextBox.KeyDown le mettre chaque fois qu'il était avant? quelque chose comme ca? – Agzam

+0

Mettre "Cursor.Show();" Dans l'événement KeyDown, le curseur réapparaît parfois lorsque vous avez fini de taper. –

+0

Non ... Je dois montrer le curseur au moment de taper ... J'ai essayé comment vous avez dit - n'a pas fonctionné ... – Agzam

1

Je vais répondre à la question. Les effets secondaires et les répercussions sont de votre responsabilité. Y a-t-il une autre façon de le faire? Je suis certain.

Créez une variable "state" pour conserver l'état de la saisie ou non d'un utilisateur. Les boîtes de texte ont différents événements pour vous informer lorsque quelqu'un tape, EN_CHANGE, etc., toute cette famille d'événements et ainsi de suite. Définissez la variable d'état true lorsque l'utilisateur est en train de taper. False lorsque vous ne tapez pas, EN_LOSTFOCUS, etc.

Interceptez une entrée de souris via un événement PreProcessMessage ou un événement PreTranslateMessage, ou tout autre événement approprié.

Appelez "ShowCursor" ou potentiellement "SetCursor" dans l'événement OnPaint alors que la variable d'état est vraie. Ouais, velu, hein. Ne l'appelez pas tant que la variable d'état est fausse.

Déboguer, déboguer, déboguer après cela. HTH

Si ce n'est pas clair après et je vais élargir ma réponse.

+0

Voir la réponse d'Ike pour une réponse plus "WinForm". – JustBoo