Вопрос

У меня есть одна форма, собственный рисунок, без элементов управления.

Когда мне нужно получить ввод от пользователя, я перехожу к событию OnKeyDown, а затем сопоставляю KeyData события со строкой** - чтобы я мог распознать, что пользователь нажал «ctrl X» и т. д., так что все почти в порядке...проблема в разных настройках клавиатуры и буквах, специфичных для языка, поэтому на сегодняшний день мои пользователи получают

ã -> а

ó -> о

Итак, мне нужно событие KeyPress, верно?Но как мне узнать, что пользователь ввел, например, «ł», а не alt+L?Я уже какое-то время не могу прийти в себя от этого...

** - Мне нужно сделать это так, поскольку я разрешаю пользователям настраивать ярлыки, а использование .ToString() создает не такой удобный для пользователя текст, как «OemPeriod, Control» или даже лучше:«Ключ управления, контроль»

Это было полезно?

Решение

Да, вам понадобится событие KeyPress.Или, скорее, переопределить OnKeyPress.Сопоставить коды виртуальных клавиш в событии KeyDown с нажатиями клавиш довольно сложно, вам нужно знать текущую раскладку клавиатуры.Взгляните на Документы MSDN для ToUnicodeEx() чтобы увидеть, с чем вы столкнулись.

Вам не нужно беспокоиться о комбинациях клавиш, таких как Alt+L.Они не генерируют событие KeyPress.

Вот пример.Запустите новый проект Windows Forms и придайте коду следующий вид:

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);
    }
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top