Фокус текстовое поле при нажатии клавиши - PullRequest
1 голос
/ 22 июня 2011

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

    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();
        }
    }

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

Это довольно сложно сделать, сообщение 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);
0 голосов
/ 22 июня 2011

Примерно так:

private void MainForm_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        textBoxCode.Focus();
        textBoxCode.Text = (char)e.KeyCode;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...