2009-10-30 13 views
10

A pesar de que yo trabajara con C# (Windows Forms) durante años, estoy teniendo un cerebro falle momento, y no puedo por la vida de a averiguar cómo atrapar a un usuario escribir Ctrl + C en un cuadro de texto.Ctrl + C en un cuadro de texto

Mi aplicación es básicamente una aplicación de terminal, y quiero Ctrl +C para enviar una (byte)3 a un puerto serie, en lugar de ser el acceso directo para copiar al portapapeles.

Establecí la propiedad de accesos directos enabled en false en el cuadro de texto. Sin embargo, cuando el usuario pulsa Ctrl + C, el evento de pulsación de tecla no se activa.

Si cojo keydown, se activa el evento cuando el usuario pulsa Ctrl (es decir, antes de que lleguen a la tecla C ).

Probablemente es algo estúpidamente simple que me falta.

Respuesta

32

seguir adelante y utilizar el evento KeyDown, pero en la que el registro de eventos para tantoCtrl y C, así:

if (e.Control && e.KeyCode == Keys.C) { 
    //... 
    e.SuppressKeyPress = true; 
} 

Además, para evitar el procesamiento de la pulsación de tecla por el cuadro de texto subyacente , establezca la propiedad SuppressKeyPress en verdadero como se muestra.

+0

Aceptado como lo fue la primera respuesta de trabajo. Muchas gracias. - Finalmente lo resolví - ver mi propia respuesta. – Bryan

+0

Lo sé, ha pasado un tiempo, pero para aquellos que encontrarán esto en el futuro: Shift-Insert todavía se maneja, por lo que necesita agregar validación (e.Shift && e.KeyCode == Keys.Insert). Además, el usuario aún puede hacer clic derecho en el campo y seleccionar Pegar ... Entonces no es 100% de prueba. – trailmax

1

intente lo siguiente: capturar la flecha hacia arriba yflecha hacia abajo eventos. Cuando detecte flecha abajo para CTRL, establezca un indicador; cuando detecte flecha arriba, restablezca el indicador. Si detecta la clave C mientras se establece el indicador, tiene Ctrl + C.

Editar. Ouch ... La respuesta de Jay es definitivamente mejor. :-)

6

eventos clave se presentan en el siguiente orden:

  1. KeyDown
  2. KeyPress
  3. KeyUp

El evento KeyPress no aumente en claves no son caracteres; sin embargo, las claves que no son caracteres plantean los eventos KeyDown y KeyUp. El control es una clave sin carácter.

Usted puede comprobar con esta línea de código: if (e.KeyData == (Keys.Control | Keys.C))

3

D'oh! Lo descubrí. De los tres eventos posibles, ¡el que no he probado es el que necesitaba!El evento KeyUp es la importante:

private void txtConsole_KeyUp(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData == (Keys.C | Keys.Control)) 
    { 
     _consolePort.Write(new byte[] { 3 }, 0, 1); 
     e.Handled = true; 
    } 
} 
+1

Bueno, todos ustedes me ganaron. KeyDown no funcionaba para mí, ya que estaba usando puntos de interrupción para atrapar los eventos. Sin embargo, funcionó bien en KeyUp, de ahí por qué me decidí por este evento. – Bryan

5

que tenía un problema captura Ctrl +C en un TextBox por KeyDown. Solo obtuve la clave Control cuando se presionaron Control y C. La solución estaba usando PreviewKeyDown:

private void OnLoad() 
{ 
    textBox.PreviewKeyDown += OnPreviewKeyDown; 
    textBox.KeyDown += OnKeyDown; 
} 

private void OnPreviewKeyDown(object sender, PreviewKeyDownEventArgs e) 
{ 
    if (e.Control) 
    { 
     e.IsInputKey = true; 
    } 
} 

private void OnKeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.Control && e.KeyCode == Keys.C) { 
     textBox.Copy(); 
    } 
} 
+0

No es cierto, la captura de eventos KeyUp es la solución correcta. – TarmoPikaro

1

No sé si es porque algún cambio en la versión nueva o porque estoy tratando de utilizar esto en ListBox, pero no hay e.Control en KeyEventArgs e que recibo de KeyDown.

que tenía que trabajar en torno a la solución, se me ocurrió esto (que no es el más bonito, pero funciona bien):

private List<Key> KeyBuff = new List<Key>(); 

private void ListBox_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (!KeyBuff.Exists(k => k == e.Key)) 
     KeyBuff.Add(e.Key); 

    if (KeyBuff.Exists(k => k == Key.LeftCtrl || k == Key.RightCtrl) && 
     KeyBuff.Exists(k => k == Key.C)) 
    { 
     // Desired detection 
     Clipboard.SetText(SelectedText); 
    } 
} 

private void ListBox_KeyUp(object sender, KeyEventArgs e) 
{ 
    KeyBuff.Clear(); 
} 
Cuestiones relacionadas