Фокус текстового поля при нажатии клавиши

Я хочу сфокусировать текстовое поле при нажатии клавиши. Я использую этот код:

    private void MainForm_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        textBoxCode.Focus();
    }

С KeyPreview = true в моей форме. Но когда я это сделаю, если я напишу «az», в моем текстовом поле появится только символ «z». Если я нажму только «a», textboxCode будет пустым, но будет в фокусе.

Как не потерять нажатую клавишу?

РЕШЕНИЕ:

    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (textBox1.Focused == false)
        {
            textBox1.Text += e.KeyChar.ToString();
            textBox1.SelectionStart = textBox1.Text.Length;
            textBox1.Focus();
        }
    }

person FRO    schedule 21.06.2011    source источник


Ответы (2)


Это довольно сложно сделать, сообщение WM_KEYDOWN, которое отправляет Windows, уже зафиксировано в окне, которое имеет фокус. Вы не хотите заниматься преобразованием событий нажатия клавиш в набор символов - это ракетная наука в раскладке клавиатуры с мертвыми клавишами, которая производит только взрывающиеся ракеты.

Одна вещь, которую вы можете сделать, - это повторно опубликовать сообщение клавиатуры, теперь с дескриптором окна текстового поля. Вы можете сделать это, переопределив метод ProcessCmdKey () формы, чтобы обнаруживать нажатие клавиши и возвращать true, чтобы предотвратить его дальнейшую обработку. Нравится:

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
        if (!textBox1.Focused) {
            PostMessage(textBox1.Handle, msg.Msg, msg.WParam, msg.LParam);
            textBox1.Focus();
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern IntPtr PostMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
person Hans Passant    schedule 21.06.2011
comment
Я нашел более простое решение - person FRO; 22.06.2011
comment
Я вас об этом специально предупреждал. Это не работает на неанглоязычных клавиатурах. И плохо себя веди, если не нажимаешь печатные клавиши. - person Hans Passant; 22.06.2011

Что-то вроде этого:

private void MainForm_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        textBoxCode.Focus();
        textBoxCode.Text = (char)e.KeyCode;
    }
person taylonr    schedule 21.06.2011
comment
Я уже пробовал это решение, но если я наберу «аз», текст текстового поля будет «za». - person FRO; 22.06.2011