Как разрешить 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, который вы слышите, если вы пытаетесь стереть текст из пустого текстового поля (попробуйте его с помощью адресной строки браузера).
Ответы
Ответ 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;
}
}