Подтвердить что ты не робот

Как разрешить ctrl + a с TextBox в winform?

Я задаю уже заданный вопрос (и даже ответил): Почему некоторые текстовые поля не принимают Control + ярлык, чтобы выбрать все по умолчанию?

Но этот ответ не работает для меня. У меня есть этот код:

public class LoginForm : Form
{
    private TextBox tbUsername;

    public LoginForm()
    {
        tbUsername = new TextBox();
        tbUsername.ShortcutsEnabled = true;
        tbUsername.Multiline = false;
        Controls.Add(tbUsername);
    }
}

Появится текстовое поле, я могу писать на нем, я могу вырезать, скопировать и вставить текст на него без каких-либо проблем. Но когда я пытаюсь нажать Ctrl + A, я слышу только "bling", подобный bling, который вы слышите, если вы пытаетесь стереть текст из пустого текстового поля (попробуйте его с помощью адресной строки браузера).

4b9b3361

Ответ 1

Как и другие ответы, следует вызвать Application.EnableVisualStyles(). Также значение TextBox.ShortcutsEnabled должно быть установлено на true. Но , если ваш TextBox.Multiline включен, то Ctrl + A не будет работать (посмотреть Документация MSDN). Использование RichTextBox вместо этого обойдется проблемой.

Ответ 2

Просто создайте событие keydown для данного TextBox и включите этот код:

private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.A)
    {
        if (sender != null)
            ((TextBox)sender).SelectAll();
    }
}

Ответ 3

Вы всегда можете переопределить ключи команды процесса, чтобы получить желаемый результат

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    const int WM_KEYDOWN = 0x100;
    var keyCode = (Keys) (msg.WParam.ToInt32() &
                          Convert.ToInt32(Keys.KeyCode));
    if ((msg.Msg == WM_KEYDOWN && keyCode == Keys.A) 
        && (ModifierKeys == Keys.Control) 
        && tbUsername.Focused)
    {
        tbUsername.SelectAll();
        return true;
    }            
    return base.ProcessCmdKey(ref msg, keyData);
}

Ответ 4

Это случилось со мной однажды, я предполагаю, что вы удалили вызов Application.EnableVisualStyles(); из своей программы? Добавьте его обратно в функцию Main(), и все должно работать нормально.

Ответ 5

Быстрый ответ заключается в том, что если вы используете многострочное значение true, вы должны явно вызвать select all.

private void tbUsername_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.A && e.Control)
    {
        tbUsername.SelectAll();
    }
}

Ответ 6

Текстовое поле имеет метод SelectAll() и отлично работает для меня. (.net 4.5)

Ответ 7

Не нужно обрабатывать WM_KEYDOWN! Я знаю, что большинство примеров здесь (и CodeProject и многие другие) все говорят, что есть, но он не вылечивает звуковой сигнал, который возникает всякий раз, когда возникает WM_CHAR, который не обрабатывается.

Вместо этого попробуйте следующее:

LRESULT CALLBACK Edit_Prc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
  if(msg==WM_CHAR&&wParam==1){SendMessage(hwnd,EM_SETSEL,0,-1); return 1;}
  else return CallWindowProc((void*)WPA,hwnd,msg,wParam,lParam);
}

Не забудьте подклассифицировать элемент управления EDIT на этот Edit_Prc(), используя WPA = SetWindowLong (...), где WPA - это адрес оконной процедуры для CallWindowProc (...)

Я понял это на основе эксперимента, обнаружив, что все ответы, которые я нашел в Интернете, настаивали на обработке WM_KEYDOWN, используя GetKeyState(), и закончили с большим кодом, который не смог остановить этот раздражающий звуковой сигнал!

В то время как этот ответ не касается dotnet, в таких случаях обычно лучше разрезать на погоню и решать его, а не мучиться тем, какая версия большой системы обертки кода может или не может сделать это для вас, особенно если вы хотите избежать риска борьбы с встроенным поведением.

Ответ 8

Бросьте мои два цента. Вызов этого при нажатии клавиши - это еще один вариант.

private void TxtBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\x1')
    {
        TxtBox.SelectAll();
        e.Handled = true;
    }
}