0

У меня есть одна форма, пользовательский чертеж, никаких элементов управления.WinForms, обработка всех ключей = OnKeyPress + OnKeyDown, но как?

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

ã -> а

ó -> о

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

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

ответ

2

Да, вам понадобится событие KeyPress. Вернее, переопределить OnKeyPress. Сопоставление виртуальных кодов клавиш в событии KeyDown с нажатиями клавиш довольно сложно, вам нужно будет знать текущую раскладку клавиатуры. Взгляните на MSDN docs for 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); 
    } 
    } 
} 
+0

Хм, поправьте меня, если я ошибаюсь, но KeyDown это до события KeyPress, так что ... В KeyDown мне нужно знать, если нажатые клавиши будут обрабатываться KeyPress ... поэтому я буду использовать ToUnicodeEx, правильно? Но если я использую ToUnicodeEx, то мне не понадобится событие KeyPress, правильно? – argh

+0

Нет, вам не нужно знать. KeyPress сообщит вам об этом. Не используйте ToUnicodeEx(). –

+0

Хмм я, возможно, делаю это «неправильно», но я все обрабатываю в KeyDown, и все, кажется, работает нормально :) Но можете ли вы «показать» мне в нескольких строках псевдокода, как выглядит ваше решение? – argh