Come acquisisco Keys.F1 indipendentemente dal controllo focalizzato su un modulo?

Ho usato l’evento KeyDown e un codice semplice come if (e.KeyCode == Keys.F1) per catturare F1 viene premuto su un modulo MA se ci sono alcune caselle di testo nel modulo o se ci sono dei fogli di lavoro con Dock Fill sul modulo quindi il codice sopra diventa inutile e non fa nulla. Ma voglio fare qualcosa quando l’utente preme F1 su questo modulo. quindi come facciamo a catturare uno specifico evento keydown come F1 sull’intero form … e non voglio andare sulla rotta che cattura KeyDown di tutti gli altri controlli sul modulo e passarli al Form per l’elaborazione. c’è un modo più pulito per fare questo?

Sì, certo che c’è. Il modo corretto per il modulo di gestire gli eventi chiave indipendentemente dal controllo che attualmente ha il focus di input è quello di sovrascrivere il metodo ProcessCmdKey della class del modulo:

 protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { if (keyData == Keys.F1) { MessageBox.Show("You pressed the F1 key"); return true; // indicate that you handled this keystroke } // Call the base class return base.ProcessCmdKey(ref msg, keyData); } 

Si restituisce true per indicare che si è gestito il tasto e non si desidera che venga passato ad altri controlli. Se si desidera che venga passato ai gestori di eventi per altri controlli, è sufficiente restituire false .

E stai meglio ignorando la proprietà KeyPreview . Questo è un anacronismo dal VB 6 giorni e non è davvero il modo preferito di farlo nel mondo .NET. Ulteriori letture: svantaggi di impostare Form.KeyPreview = true?

Imposta il KeyPreview del modulo su true. Ciò assicurerà che il modulo prenda per primo i messaggi della e.Handled = true e, se lo e.Handled = true , puoi impostare e.Handled = true modo che non venga trasmesso ai controlli.

Attiva KeyPreview e ogni volta che si preme il tasto nel modulo, verrà inviato prima attraverso i gestori di eventi chiave.

Un altro modo è quello di sovrascrivere la funzione ProcessCmdKey http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=VS.100).aspx