form evento c# winforms textbox keyboard-shortcuts

c# - evento - ¿Cómo puedo permitir ctrl+a con TextBox en winform?



on key pressed c# (8)

¡No es necesario manejar WM_KEYDOWN! Sé que la mayoría de los ejemplos aquí (y CodeProject y muchos otros lugares) dicen que sí, pero no cura el pitido que resulta cada vez que surge un WM_CHAR que no se maneja.

En cambio, intente esto:

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

Recuerde subclasificar el control EDITAR a este Edit_Prc () usando WPA = SetWindowLong (...) donde WPA es la dirección del procedimiento de ventana para CallWindowProc (...)

Lo descubrí por experimento, después de encontrar que todas las respuestas que encontré en línea insistían en manejar WM_KEYDOWN, usando GetKeyState (), ¡y terminé con un código más grande que no pudo detener ese pitido molesto!

Si bien esta respuesta no trata con dotnet, en casos como este generalmente es mejor ir a la caza y resolverlo en lugar de agonizar sobre qué versión de un sistema de envoltura de código grande puede o no puede hacerlo por usted, especialmente si lo desea para evitar el riesgo de luchar contra el comportamiento incorporado.

Estoy haciendo la pregunta que ya hice (e incluso contesté) aquí: ¿Por qué algunos cuadros de texto no aceptan el atajo Control + A para seleccionar todo de manera predeterminada?

Pero esa respuesta no funciona para mí. Tengo este código:

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

El cuadro de texto aparece, puedo escribir en él, puedo cortar, copiar y pegar texto sin problemas. Pero cuando trato de presionar Ctrl + A solo escucho un "bling" similar al bling que escuchas si tratas de borrar el texto de un cuadro de texto vacío (pruébalo con la barra de direcciones de tu navegador).


Como indican otras respuestas, debe Application.EnableVisualStyles() . También el TextBox.ShortcutsEnabled debe establecer en true . Pero si su TextBox.Multiline está habilitada, entonces Ctrl + A no funcionará ( consulte la documentación de MSDN ). Usar RichTextBox lugar solucionará el problema.


Esto también me pasó a mí una vez, supongo que eliminaste la solicitud de Application.EnableVisualStyles(); de tu programa? Agréguelo a la función Main() y todo debería funcionar bien.


La respuesta rápida es que si está utilizando true multiline true, debe llamar explícitamente a select all.

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


Lanzando mis dos centavos. Llamar esto bajo la presión de tecla es solo otra opción.

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


Siempre puede anular las teclas de comando de proceso para obtener el resultado deseado

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


Simplemente cree un evento de selección para ese TextBox en cuestión e incluya este código:

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


Textbox tiene un método SelectAll() y funcionó bien para mí. (.net 4.5)