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"

È stato utile?

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);
    }
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top