2009-10-30 2 views
10

Nonostante me lavorare con C# (Windows Forms) per anni, sto avendo un cervello sicuro momento, e non posso per la vita di me a capire come prendere un utente a digitare Ctrl + C in una casella di testo.Facendo Ctrl + C in una casella di testo

La mia domanda è sostanzialmente un'applicazione terminale, e voglio Ctrl +C per inviare un (byte)3 a una porta seriale, piuttosto che essere la scorciatoia per la copia negli Appunti.

Ho impostato le proprietà scorciatoie enabled su false nella casella di testo. Tuttavia, quando l'utente tocca Ctrl + C, l'evento keypress non viene attivato.

Se prendo keydown, l'evento quando l'utente preme Ctrl (vale a dire, prima che colpiscano il chiave C).

È probabilmente qualcosa di stupidamente semplice che mi manca.

risposta

32

Vai avanti e utilizzare l'evento KeyDown, ma in quel controllo evento per siaCtrl e C, in questo modo:

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

Inoltre, per evitare l'elaborazione del tasto dal TextBox sottostante , imposta la proprietà SuppressKeyPress su true come mostrato.

+0

accettato come è stata la prima risposta di lavoro. Grazie molto. - Alla fine ho capito - vedi la mia risposta. – Bryan

+0

Lo so, è passato un po 'di tempo, ma per chi lo troverà in futuro: Shift-Insert è ancora gestito, quindi è necessario aggiungere (e.Shift && e.KeyCode == Keys.Insert) validazione. Anche l'utente può ancora fare clic con il pulsante destro del mouse sul campo e selezionare Incolla ... Quindi non prova al 100%. – trailmax

1

provare quanto segue: catturare il freccia su e freccia giù eventi. Quando si rileva freccia giù per CTRL, impostare un flag; quando si rileva freccia su, reimpostare il flag. Se si rileva la chiave C mentre il flag è impostato, si ha Ctrl + C.

Modifica. Ahi ... La risposta di Jay è decisamente migliore. :-)

6

eventi principali si verificano nel seguente ordine:

  1. KeyDown
  2. KeyPress
  3. TastoSu

L'evento KeyPress non sia aumentata di chiavi noncharacter; tuttavia, i tasti non caratteri aumentano gli eventi KeyDown e KeyUp. Il controllo è una chiave non di caratteri.

È possibile controllare con questa riga di codice: if (e.KeyData == (Keys.Control | Keys.C))

3

D'oh! Ho appena capito. Tra i tre possibili eventi, quello che non ho provato è quello di cui avevo bisogno!L'evento KeyUp è l'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

Beh, mi avete battuto tutti. KeyDown non funzionava per me, perché stavo usando i breakpoint per catturare gli eventi. Ha funzionato bene su KeyUp però, quindi perché ho optato per questo evento. – Bryan

5

Ho avuto un problema di cattura Ctrl +C su un TextBox da KeyDown. Ho ricevuto solo la chiave Control quando sono stati premuti sia Control sia C. La soluzione è stata 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

Non vero, la cattura di eventi KeyUp è la soluzione corretta. – TarmoPikaro

1

Non so se è perché qualche cambiamento nella versione più recente o perché sto cercando di usare questo su ListBox, ma non c'è e.Control in KeyEventArgs e che ricevo da KeyDown.

ho dovuto aggirare soluzione, sono arrivato fino a questo (non è la più bella, ma funziona benissimo):

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