c# - ¿Por qué algunos cuadros de texto no aceptan el acceso directo Control+A para seleccionarlos de manera predeterminada?
select textbox (5)
No sé si la pregunta es tonta, pero encuentro pocos cuadros de texto aquí y allá en mi propio programa que acepta Control + Un atajo para seleccionar el texto completo "por defecto" con "sin codificación".
No sé qué información adicional debo proporcionar aquí, ya que no encuentro absolutamente ninguna diferencia entre esos cuadros de texto. Esos son todos simples cuadros de texto arrastrados y soltados.
Nota: No estoy hablando de este pedazo de código:
if (e.Control && e.KeyCode == Keys.A)
{
textBox1.SelectAll();
}
Quiero la selección por defecto ... O de todos modos hay que cambiar la propiedad del cuadro de texto para que los cuadros de texto acepten todos los accesos directos predeterminados de Windows.
Editar: ¡ Todo lo demás ( Control + Z
, Control + X
, Control + C
, Control + V
) funciona por defecto! ¿Por qué no Control + A
?
Actualización: los cuadros de texto que aceptaron Ctrl+A
de manera predeterminada fueron cuadros de texto enmascarados , no el cuadro de texto normal. Y en ese punto estaba con .NET 2.0. Pero supongo que el problema original era otra cosa, ya que puedo ver que Ctrl+A
funciona bien por defecto en el código .NET 2.0.
Asegúrese de que Application.EnableVisualStyles (); no está comentado en el vacío estático Principal ()
Eso puede desactivar Ctrl + A
De hecho, CTRL + A no funcionará a menos que agregue algo como esto:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && (e.KeyCode == Keys.A))
{
if (sender != null)
((TextBox)sender).SelectAll();
e.Handled = true;
}
}
Es posible que esté buscando la propiedad ShortcutsEnabled . Establecerlo en true
permitiría que sus cuadros de texto implementen el atajo Ctrl + A (entre otros). De la documentación:
Use la propiedad
ShortcutsEnabled
para habilitar o deshabilitar las siguientes combinaciones de teclas de método abreviado:
CTRL + Z
CTRL + E
CTRL + C
CTRL + Y
CTRL + X
CTRL + RETROCESO
CTRL + V
CTRL + ELIMINAR
CTRL + A
MAYÚS + ELIMINAR
CTRL + L
MAYÚS + INSERTAR
CTRL + R
EDITAR:
Sin embargo, la ShortcutsEnabled dice:
El control TextBox no admite la tecla de método abreviado CTRL + A cuando el valor de propiedad Multiline es verdadero.
Probablemente tendrá que usar otra subclase de TextBoxBase
, como RichTextBox , para que funcione.
Esta pregunta quiere una respuesta que no puede darse en forma de evasión de código, ya que la API de Win32 en el núcleo de los otros métodos no lo permite. Si otros métodos lo permiten, solo están escribiendo el código para usted. :)
Entonces, la verdadera pregunta es: ¿Cuál es la forma más pequeña y buena de hacerlo? Esto funcionó para mí:
Primero, ¡no hay necesidad de manejar WM_KEYDOWN! Y no es necesario probar la tecla Ctrl ya tampoco. 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 su lugar, intente manejar WM_CHAR y hacer la selección Ctrl + A allí:
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 (...)
Esta respuesta funcionó para mí en una pregunta similar (que no está marcada como aceptada)
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)
&& txtYourTextBox.Focused)
{
txtYourTextBox.SelectAll();
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
Publicación original: ¿Cómo puedo permitir ctrl + a con TextBox en winform?