2011-01-04 4 views
11

ho pensato Ho risolto questo problema da sola, ma è tornato a tormentare la mia domanda così qui va:non può rilevare una scorciatoia Ctrl + Tasto su eventi KeyDown ogni volta che c'è una casella di testo in sola lettura con messa a fuoco

ho il seguente gestore di eventi KeyDown registrato con una forma con un paio di disabili e di sola lettura caselle di testo e sono solo i collegamenti semplici per i pulsanti:

private void AccountViewForm_KeyDown(object sender, KeyEventArgs e) 
    { 
     //e.SuppressKeyPress = true; 
     //e.Handled = true; 
     if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.E && !isInEditMode) 
      btnEditMode_Click(sender, e); 
     if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.S && isInEditMode) btnEditMode_Click(sender, e); 
     if (e.KeyCode == Keys.Escape) btnCancel_Click(sender, e); 
     if (Control.ModifierKeys == Keys.Control && e.KeyCode == Keys.W) Close(); 
    } 

il form ha KeyPreview impostato su true, ma ogni volta che una casella di testo in sola lettura è stato attivato e premo Ctrl + E non riesco a ottenere "Control.ModifierKeys == Keys.Control" e "e.KeyCode == Keys.E" per essere entrambi veri allo stesso tempo. Ciò che è veramente strano è che Ctrl + W funziona. Qualcuno ha idea di cosa diavolo sta succedendo? :(

+0

Mi rendo conto che questo è vecchio. Il tuo codice fa riferimento a "Control.ModifierKeys". Dovrebbe probabilmente essere "e.Modifiers". – Metro

risposta

18

Secondo this question e this one, sembra un modo più generale per gestire le scorciatoie da tastiera è quello di eseguire l'override del metodo di ProcessCmdKey():

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { 
    if (keyData == (Keys.Control | Keys.F)) { 
    MessageBox.Show("What the Ctrl+F?"); 
    return true; 
    } 
    return base.ProcessCmdKey(ref msg, keyData); 
} 

Hai pensato di usare Alt +E e Alt + S e semplicemente impostando la proprietà mnemonica per i pulsanti? Sembra funzionare bene per me ed è più semplice da configurare.

+0

beh, questo è un modo migliore per gestirlo bene, nessun comportamento più strano. grazie – francis

+0

Questo può anche essere fatto se si sostituisce la funzione DefWndProc. if (Control.ModifierKeys == (Keys.Control | Keys.F)) { // Whatever } – David

Problemi correlati