WinForms, gestione di tutti i tasti = + OnKeyPress OnKeyDown, ma come?
-
21-09-2019 - |
Domanda
Ho una forma, disegno personalizzato, nessun controllo.
Quando ho bisogno di ottenere l'input da parte dell'utente vado a eventi OnKeyDown e quindi mappare KEYDATA dell'evento in una stringa ** - in modo che posso riconoscere che l'utente ha premuto "ctrl X", ecc, quindi tutto è quasi ok ... il problema è con diverse impostazioni della tastiera e le lettere in lingua originale - così per oggi i miei utenti ottengono
-> a
o -> o
Quindi ho bisogno KeyPress giusto? Ma come faccio a sapere che l'utente digitato ad esempio 'L' e non alt + L? Non riesco a ottenere la mia testa in giro che da un po '...
** - ho bisogno di farlo così da quando ho lasciato agli utenti di configurare le scorciatoie e utilizzando .ToString () produce non così facile da usare come testo "OemPeriod, Control" o meglio ancora: "controlKey, controllo"
Soluzione
Sì, è necessario l'evento KeyPress. O meglio, ignorare OnKeyPress. Mappatura codici chiave virtuali nell'evento KeyDown a colpi di chiave è abbastanza difficile, che avrebbe dovuto essere a conoscenza del layout di tastiera corrente. Date un'occhiata alla documentazione MSDN per ToUnicodeEx () per vedere che cosa si è di fronte.
Non dovete preoccuparvi di combinazioni di tasti come Alt + L. Essi non generano un evento KeyPress.
Ecco un esempio. Avviare un nuovo progetto Windows Form e rendere il codice simile al seguente:
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);
}
}
}