WinForms, die Behandlung aller Tasten = OnKeyPress + OnKeyDown, aber wie?
-
21-09-2019 - |
Frage
Ich habe ein Formular, benutzerdefinierte Zeichnen bekommt, keine Kontrollen.
Wenn ich brauche die Eingabe vom Benutzer erreiche ich Ereignis OnKeyDown gehen und dann Veranstaltung KeyData in einem String Karte ** - so, dass ich diesen Benutzer erkennen kann, hat „ctrl X“ gedrückt wird, usw., also fast alles in Ordnung ist ... das Problem ist mit verschiedenen Tastatureinstellungen und sprachspezifische Buchstaben - so für heute meine Nutzer bekommen
-> a
ó -> o
Also habe ich das KeyPress-Ereignis richtig brauchen? Aber wie kann ich wissen, dass Benutzer eingegeben zum Beispiel ‚l‘ und nicht alt + L? Ich kann meinen Kopf nicht für ein um das bekommen, während jetzt ...
** - Ich brauche es, so zu tun, da ich damit Benutzer zu konfigurieren Verknüpfungen und mit .ToString () erzeugt nicht so benutzerfreundlich Text wie „OemPeriod, Control“ oder noch besser: „controlKey, Control“
Lösung
Ja, werden Sie das KeyPress-Ereignis benötigen. Oder besser gesagt, außer Kraft setzen OnKeyPress. virtuellen Schlüssel-Mapping-Codes in dem Ereignis KeyDown auf Tastenanschläge ist ziemlich schwierig, würden Sie kennen die aktuelle Tastaturlayout sein. Werfen Sie einen Blick auf die MSDN-Dokumentation für ToUnicodeEx () um zu sehen, was Sie sind gegen.
Sie müssen sich keine Sorgen machen über Tastenkombinationen wie Alt + L. Sie erzeugen keine ein KeyPress-Ereignis.
Hier ist ein Beispiel. Starten Sie eine neue Windows Forms-Projekt und stellen Sie den Code wie folgt aussehen:
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);
}
}
}