/ / Tasto di scelta rapida (non globale) in Windows Form .NET - .net, winforms, tasti di scelta rapida

Hotkey (non globale) in Windows Form .NET - .net, winforms, tasti di scelta rapida

Nella mia applicazione Windows Form vorrei un pulsante speciale per eseguire un test ogni volta che lo premo. Ci sono dozzine di controlli, quindi implementarlo in ognuno richiede troppo tempo.

C'è un modo in cui posso impostare un tasto di scelta rapida, quindi, indipendentemente da ciò che sto facendo nell'applicazione, posso premere il tasto e si spegnerà il mio evento?

risposte:

15 per risposta № 1

Puoi scavalcare ProcessCmdKey e gestire i tasti di scelta rapida lì, in un controllo o un modulo.

A partire dal MSDN:

Prima il metodo ProcessCmdKey determina seil controllo ha a ContextMenu e, in tal caso, abilita il ContextMenu per elaborare il comando chiave. Se il tasto comando non è un menu collegamento e il controllo ha un genitore, la chiave viene passata ai genitori Metodo ProcessCmdKey. L'effetto netto è che i tasti di comando sono "gorgogliati" la gerarchia di controllo. Inoltre il tasto premuto dall'utente, i dati chiave indica inoltre quale eventuale modificatore i tasti sono stati premuti contemporaneamente a il tasto. I tasti modificatori includono il MAIUSC, CTRL e ALT.

Per esempio:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// if it is a hotkey, return true; otherwise, return false
switch (keyData)
{
case Keys.Control | Keys.C:
// do something
return true;
default:
break;
}

return base.ProcessCmdKey(ref msg, keyData);
}

4 per risposta № 2

Puoi sovrascrivere il metodo ProcessCmdKey () di un modulo,viene eseguito prima che qualsiasi controllo sul modulo visualizzi il tratto chiave. Se hai davvero bisogno che questo sia a livello di applicazione (tutti i moduli), allora il tuo modulo principale dovrebbe implementare l'interfaccia IMessageFilter. Per esempio:

public partial class Form1 : Form, IMessageFilter {
public Form1() {
InitializeComponent();
Application.AddMessageFilter(this);
this.FormClosed += (o, e) => Application.RemoveMessageFilter(this);
}
public bool PreFilterMessage(ref Message m) {
// Catch WM_KEYDOWN message
if (m.Msg == 0x100 && (Keys)m.WParam == Keys.F1) {
MessageBox.Show("Help me!");
return true;
}
return false;
}
}

1 per risposta № 3

Se hai solo un modulo. È possibile impostare Form.KeyPreview = true e quindi aggiungere il codice all'evento chiave del modulo.