Pergunta

Eu tenho um formulário, desenho personalizado, sem controles.

Quando preciso obter a entrada do usuário, vou para o evento OnKekeDown e, em seguida, mapear os dados do evento para uma string ** - para que eu possa reconhecer que o usuário pressionou "Ctrl X", etc., então tudo está quase ok ... O problema é com diferentes configurações do teclado e letras específicas do idioma - então, para hoje, meus usuários ficam

ã -> a

Ó -> o

Então, eu preciso do evento KeyPress certo? Mas como sei que o usuário digitou, por exemplo, 'ł' e não alt+L? Não consigo entender isso por um tempo agora ...

** - Preciso fazer isso assim, já que deixo os usuários configurarem os atalhos e o uso .toString () produz um texto não tão fácil de usar como "Oemperiod, Control" ou melhor: "ControlKey, Control"

Foi útil?

Solução

Sim, você precisará do evento KeyPress. Ou melhor, substitua o OnkeyPress. O mapeamento de códigos de chave virtual no evento KeyDown para os principais golpes é bastante difícil, você teria que estar ciente do layout atual do teclado. Dê uma olhada no MSDN DOCs para Tounicodeex () Para ver o que você está enfrentando.

Você não precisa se preocupar com combinações de pressionamento de teclas como Alt+L. Eles não geram um evento KeyPress.

Aqui está um exemplo. Inicie um novo projeto do Windows Forms e faça o código parecer o seguinte:

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);
    }
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top