0

J'ai un formulaire, un dessin personnalisé, pas de contrôles. Quand j'ai besoin d'obtenir l'entrée de l'utilisateur, je vais à l'événement OnKeyDown et ensuite mapper KeyData de l'événement à une chaîne ** - pour que je puisse reconnaître que l'utilisateur a pressé "ctrl X", etc, donc tout est presque ok ... le problème est avec les différents paramètres du clavier et la langue des lettres spécifiques - donc pour aujourd'hui mes utilisateurs seWinForms, Gestion de toutes les clés = OnKeyPress + OnKeyDown, mais comment?

ã -> un

ó -> o

Je dois donc l'événement KeyPress droit? Mais comment puis-je savoir que cet utilisateur a tapé par exemple '³' et non alt + L? Je ne peux pas comprendre cela depuis un moment maintenant ...

** - Je dois le faire comme ça puisque je laisse les utilisateurs configurer des raccourcis et utiliser .ToString() ne produit pas un texte aussi convivial que "OemPeriod, Control" ou mieux: "ControlKey, Control"

Répondre

2

Oui, vous aurez besoin de l'événement KeyPress. Ou plutôt, remplacez OnKeyPress. Mapper des codes de clé virtuelle dans l'événement KeyDown à des traits de touches est assez difficile, vous devez être conscient de la disposition actuelle du clavier. Jetez un oeil à la MSDN docs for 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 d'événement KeyPress.

Voici un exemple. Démarrez un nouveau Windows Forms projet 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); 
    } 
    } 
} 
+0

Hmm, corrigez-moi si je me trompe, mais KeyDown est avant l'événement KeyPress, alors ... En KeyDown je dois savoir si le les touches pressées vont être manipulées par KeyPress ... donc je vais utiliser ToUnicodeEx, non? Mais si j'utilise ToUnicodeEx, je n'aurai pas besoin de l'événement KeyPress, n'est-ce pas? – argh

+0

Non, vous n'avez pas besoin de savoir. KeyPress vous le fera savoir. N'utilisez pas ToUnicodeEx(). –

+0

Hmm Je le fais peut-être mal, mais je gère tout dans KeyDown et tout semble fonctionner correctement :) Mais pouvez-vous me montrer quelques lignes de pseudo-code à quoi ressemble votre solution? – argh

Questions connexes