WinForms, Обработка всех клавиш = OnKeyPress + OnKeyDown, а как?
-
21-09-2019 - |
Вопрос
У меня есть одна форма, собственный рисунок, без элементов управления.
Когда мне нужно получить ввод от пользователя, я перехожу к событию 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);
}
}
}