Il modo migliore per implementare le scorciatoie da tastiera in un’applicazione Windows Form?

Sto cercando il modo migliore per implementare le scorciatoie da tastiera comuni di Windows (ad esempio Ctrl + F , Ctrl + N ) nella mia applicazione Windows Form in C #.

L’applicazione ha una forma principale che ospita molti moduli figlio (uno alla volta). Quando un utente preme Ctrl + F , mi piacerebbe mostrare un modulo di ricerca personalizzato. Il modulo di ricerca dipende dal modulo figlio aperto corrente nell’applicazione.

Stavo pensando di utilizzare qualcosa di simile nell’evento ChildForm_KeyDown :

if (e.KeyCode == Keys.F && Control.ModifierKeys == Keys.Control) // Show search form 

Ma questo non funziona. L’evento non si triggers nemmeno quando si preme un tasto. Qual’è la soluzione?

Probabilmente hai dimenticato di impostare la proprietà KeyPreview del modulo su True. L’override del metodo ProcessCmdKey () è la soluzione generica:

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

Sul tuo modulo principale

  1. Imposta KeyPreview su True
  2. Aggiungi il gestore di eventi KeyDown con il seguente codice

     private void MainForm_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.N) { SearchForm searchForm = new SearchForm(); searchForm.Show(); } } 

Il modo migliore è utilizzare i menu mnemonici, ovvero disporre di voci di menu nel modulo principale che vengono assegnate alla scorciatoia da tastiera desiderata. Quindi tutto il resto viene gestito internamente e tutto ciò che devi fare è implementare l’azione appropriata che viene eseguita nel gestore di eventi Click di quella voce di menu.

Puoi anche provare questo esempio:

 public class MDIParent : System.Windows.Forms.Form { public bool NextTab() { // some code } public bool PreviousTab() { // some code } protected override bool ProcessCmdKey(ref Message message, Keys keys) { switch (keys) { case Keys.Control | Keys.Tab: { NextTab(); return true; } case Keys.Control | Keys.Shift | Keys.Tab: { PreviousTab(); return true; } } return base.ProcessCmdKey(ref message, keys); } } public class mySecondForm : System.Windows.Forms.Form { // some code... } 

Se si dispone di un menu, la modifica della proprietà ShortcutKeys di ToolStripMenuItem dovrebbe ToolStripMenuItem il ToolStripMenuItem .

In caso contrario, è ansible crearne uno e impostarne la proprietà visible su false.

La risposta di Hans potrebbe essere resa un po ‘più semplice per qualcuno di nuovo, quindi ecco la mia versione.

Non è necessario ingannare KeyPreview , lasciarlo impostato su false . Per usare il codice qui sotto, incollalo sotto form1_load ed esegui F5 per vederlo funzionare:

 protected override void OnKeyPress(KeyPressEventArgs ex) { string xo = ex.KeyChar.ToString(); if (xo == "q") //You pressed "q" key on the keyboard { Form2 f2 = new Form2(); f2.Show(); } } 

Dal modulo principale, devi:

  • Assicurati di impostare KeyPreview su true (TRUE per impostazione predefinita)
  • Aggiungi MainForm_KeyDown (..) – con cui puoi impostare qui le scorciatoie che vuoi.

Inoltre, ho trovato questo su google e volevo condividerlo con coloro che sono ancora alla ricerca di risposte. (per globale)

Penso che devi usare user32.dll

 protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == 0x0312) { /* Note that the three lines below are not needed if you only want to register one hotkey. * The below lines are useful in case you want to register multiple keys, which you can use a switch with the id as argument, or if you want to know which key/modifier was pressed for some particular reason. */ Keys key = (Keys)(((int)m.LParam >> 16) & 0xFFFF); // The key of the hotkey that was pressed. KeyModifier modifier = (KeyModifier)((int)m.LParam & 0xFFFF); // The modifier of the hotkey that was pressed. int id = m.WParam.ToInt32(); // The id of the hotkey that was pressed. MessageBox.Show("Hotkey has been pressed!"); // do something } } 

Leggi oltre questo http://www.fluxbytes.com/csharp/how-to-register-a-global-hotkey-for-your-application-in-c/

In WinForm, possiamo sempre ottenere lo stato della chiave di controllo:

 bool IsCtrlPressed = (Control.ModifierKeys & Keys.Control) != 0; 
  private void Form1_KeyDown(object sender, KeyEventArgs e) { if(e.Alt == true && e.KeyCode == Keys.A) { button1ADD.PerformClick(); } if(e.Alt == true && e.KeyCode == Keys.D) { button2DeleteaaLL.PerformClick(); } if(e.Alt == true && e.KeyCode == Keys.S) { Deleteselectedbtn.PerformClick(); } if(e.Alt == true && e.KeyCode == Keys.C) { button4Close.PerformClick(); } } private void Form1_Shown(object sender, EventArgs e) { txtInput.Focus(); } private void button1ADD_Click(object sender, EventArgs e) { if(!string.IsNullOrEmpty(txtInput.Text)) { Listmylist.Items.Add(txtInput.Text); txtInput.Clear(); txtInput.Focus(); } } private void button2DeleteaaLL_Click(object sender, EventArgs e) { Listmylist.Items.Clear(); txtInput.Focus(); } private void Deleteselectedbtn_Click(object sender, EventArgs e) { Listmylist.Items.RemoveAt(Listmylist.SelectedIndex); txtInput.Focus(); } private void button4Close_Click(object sender, EventArgs e) { Application.Exit(); } private void txtInput_TextChanged(object sender, EventArgs e) { button1ADD.Enabled = true; } 
 private void buttonCheck_Click_1(object sender, EventArgs e) { bool jeElement = false; for (int i = 0; i < listBox1.Items.Count; i++) { if (textBox1.Text == listBox1.Items[i].ToString()) { jeElement = true; break; } } if (jeElement) { label1.Text = "je element"; } else { label1.Text = "ni element"; } textBox1.ResetText(); textBox1.Focus(); } private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.Alt == true && e.KeyCode == Keys.A) { buttonCheck.PerformClick(); } } } } 

  private void timer1_Tick(object sender, EventArgs e) { if (radioButtonF.Checked) { progressBar1.Value++; } else { progressBar1.Value--; } if (progressBar1.Value == progressBar1.Maximum) { timer1.Stop(); label1.Text = "End"; } if (progressBar1.Value == progressBar1.Minimum) { timer1.Stop(); label1.Text = "Begining"; } } private void radioButtonF_CheckedChanged(object sender, EventArgs e) { timer1.Start(); progressBar1.Value = 0; progressBar1.Maximum = 100; } private void radioButtonB_CheckedChanged(object sender, EventArgs e) { timer1.Start(); progressBar1.Value = 100; progressBar1.Minimum = 0; } } } 

per favore non cancellare questo commento

  private void button1_Click(object sender, EventArgs e) { if (button2.Enabled == false) { timer1.Stop(); button2.Enabled = true; label1.Text = "Preteklo je " + progressBar1.Value + " desetink"; } else { timer1.Start(); button1.Enabled = false; progressBar1.Value = 0; label1.Text = ""; } } private void button2_Click(object sender, EventArgs e) { if (button1.Enabled == false) { timer1.Stop(); button1.Enabled = true; label1.Text = "Preteklo je " + progressBar1.Value + " desetink"; } else { timer1.Start(); button2.Enabled = false; progressBar1.Value = 0; label1.Text = ""; } } private void timer1_Tick(object sender, EventArgs e) { if (progressBar1.Value < progressBar1.Maximum) { progressBar1.Value++; if (progressBar1.Value == progressBar1.Maximum) { timer1.Stop(); button2.Enabled = true; button1.Enabled = true; } } } } 

}