Question

J'ai un formulaire, dessin personnalisé, aucun contrôle.

Quand je dois obtenir l'entrée de l'utilisateur que je vais à l'événement OnKeyDown et la carte puis KEYDATA de l'événement à une chaîne ** - afin que je puisse reconnaître que l'utilisateur a appuyé sur la touche « ctrl X », etc, donc tout est presque correct ... le problème est avec les différents paramètres du clavier et des lettres spécifiques de langue - donc pour aujourd'hui mes utilisateurs obtiennent

-> a

ó -> o

Je dois donc l'événement KeyPress droit? Mais comment puis-je savoir que l'utilisateur a tapé dans par exemple « l » et non alt + L? Je ne peux pas obtenir ma tête autour que, pour un certain temps maintenant ...

** - Je dois le faire comme ça depuis que je laisse aux utilisateurs de configurer des raccourcis et à l'aide .ToString () produit pas si l'utilisateur texte convivial comme « OemPeriod, Control » ou encore mieux: « controlKey, Control »

Était-ce utile?

La solution

Oui, vous aurez besoin de l'événement KeyPress. Ou plutôt, remplacer OnKeyPress. Cartographie des codes clés virtuels en cas KeyDown à coups clés est assez difficile, vous devriez être au courant de la disposition du clavier en cours. Jetez un oeil à la docs MSDN pour ToUnicodeEx () pour voir ce que vous êtes contre.

Vous n'avez pas à vous soucier des combinaisons de touches comme Alt + L. Ils ne génèrent pas un événement KeyPress.

Voici un exemple. Démarrez un nouveau projet Windows Forms et faire le look de code comme ceci:

using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1 {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }
    StringBuilder mText = new StringBuilder();

    protected override void OnKeyPress(KeyPressEventArgs e) {
      if (e.KeyChar == '\b') {
        if (mText.Length > 0) mText.Remove(mText.Length - 1, 1);
      }
      else mText.Append(e.KeyChar);
      Invalidate();
    }

    protected override void OnPaint(PaintEventArgs e) {
      TextFormatFlags fmt = TextFormatFlags.Left;
      TextRenderer.DrawText(e.Graphics, mText.ToString(), this.Font, this.ClientRectangle, Color.Black, fmt);
    }
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top