Изменение текста в label c# и utf8

458
16 января 2017, 18:36

Я хочу изменить содержимое label с клавиатуры, причем иных компонентов у меня нет, исключительно один label1 . Вот что я имею:

    private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            if (cancoding == true)
            {
                if (e.KeyCode == Keys.Back)
                    if (label1.Text != "")
                        label1.Text = label1.Text.Substring(0, label1.Text.Length - 1);
                    else
                        return;
                else
                    label1.Text += ((char)e.KeyCode).ToString();
            }
}

Сия код отлавливает все клавиши, но если я захочу ввести с клавиатуры к примеру : или захочу написать любой русский текст или просто нажать на кнопки shift,alt,CAPSLOCK он выводит непонятную дичь, не являющаяся читабельным текстом. Очень прошу помочь

Answer 1

Написание редактора текста с нуля, на самом деле, непростая задача. И проблема, упомянутая в вопросе, не единственная которая возникнет. Первое что приходит на ум (но это актуально лишь для стран вроде Японии или Китая) - поддержка ввода через IME. Из актуальных проблем, поддержка выделения, копирования, вставки и замены.

Поэтому я рекомендую для редактирования текста временно создавать TextBox и помещать его точно над Label. После нажатия определенной комбинации клавиш (допустим Enter или CTRL+ENTER), копировать текст из TextBox в Label и уничтожать TextBox.

Если все же использовать подход описанный в вопросе, то можно воспользоваться решением данным на аналогичный вопрос на англоязычном Stack Overflow: Convert keycode to char/string. Я имею ввиду непринятый автором вопроса ответ, набравший наибольшее количество голосов.

В ответе предлагается использовать функцию Win API ToUnicode. Для этого, ее необходимо импортировать:

[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern int ToUnicode(
    uint virtualKeyCode, 
    uint scanCode,
    byte[] keyboardState,
    StringBuilder receivingBuffer, 
    int bufferSize, 
    uint flags
);

Автором приводится так же пример использования этой функции, который учитывает смену регистра нажатием Shift (но не учитывает Caps Lock).

static string GetCharsFromKeys(Keys keys, bool shift)    
{
    var buf = new StringBuilder(256);
    var keyboardState = new byte[256];
    if (shift)
    {
        keyboardState[(int)Keys.ShiftKey] = 0xff;
    }
        ToUnicode((uint)keys, 0, keyboardState, buf, 256, 0);
        return buf.ToString();
}
READ ALSO
Создание массива из TextBox

Создание массива из TextBox

Добрый день, подскажите как можно задать кол-во элементов массива из TextBox?

578
EF поле сущности не устанавливается в null

EF поле сущности не устанавливается в null

Поле Customer допускает значение nullПри попытке его устновить в null, оно остается прежним

324