Le meilleur moyen d'implémenter des raccourcis clavier dans une application Windows Forms?

StackOverflow https://stackoverflow.com/questions/400113

  •  03-07-2019
  •  | 
  •  

Question

Je recherche le meilleur moyen d'implémenter les raccourcis clavier Windows courants (par exemple, Ctrl + F , Ctrl + N ) dans mon application Windows Forms en C #.

L'application dispose d'un formulaire principal qui héberge plusieurs formulaires enfants (un à la fois). Lorsqu'un utilisateur clique sur Ctrl + F , j'aimerais afficher un formulaire de recherche personnalisé. Le formulaire de recherche dépend du formulaire enfant ouvert en cours dans l'application.

Je pensais utiliser quelque chose comme ceci dans l'événement ChildForm_KeyDown :

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

Mais ça ne marche pas. L'événement ne se déclenche même pas lorsque vous appuyez sur une touche. Quelle est la solution?

Était-ce utile?

La solution

Vous avez probablement oublié de définir le KeyPreview du formulaire. propriété à True. Le remplacement de la méthode ProcessCmdKey () est la solution générique:

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

Autres conseils

Sur votre formulaire principal

  1. Définissez KeyPreview sur True
  2. Ajouter un gestionnaire d’événement KeyDown avec le code suivant

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

Le meilleur moyen consiste à utiliser les mnémoniques de menu, c’est-à-dire d’avoir dans votre formulaire principal des entrées de menu auxquelles est attribué le raccourci clavier souhaité. Ensuite, tout le reste est géré en interne et tout ce que vous avez à faire est d'implémenter l'action appropriée qui est exécutée dans le gestionnaire d'événements Cliquez de cette entrée de menu.

Vous pouvez même essayer cet exemple:

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...
}

Si vous avez un menu, changer la propriété ShortcutKeys du ToolStripMenuItem devrait faire l'affaire.

Sinon, vous pouvez en créer un et définir sa propriété visible sur false.

La réponse de Hans pourrait être un peu plus simple pour les débutants, voici donc ma version.

Vous n'avez pas besoin de vous tromper avec KeyPreview , laissez-le défini sur false . Pour utiliser le code ci-dessous, collez-le juste en dessous de votre form1_load et exécutez-le avec F5 pour le voir fonctionner:

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

À partir du formulaire principal, vous devez:

  • Assurez-vous de définir Aperçu de la clé sur Vrai (VRAI par défaut)
  • .
  • Ajouter MainForm_KeyDown (..) - permet de définir ici les raccourcis souhaités.

De plus, j'ai trouvé ceci sur Google et je voulais le partager avec ceux qui recherchent encore des réponses. (pour global)

Je pense que vous devez utiliser 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
    }
}

Lisez également ce qui suit http://www.fluxbytes.com/csharp/how-to-register-a-global-hotkey-for-your-application-in-c/

Dans WinForm, nous pouvons toujours obtenir le statut de la clé de contrôle en:

bool IsCtrlPressed = (Control.ModifierKeys & Keys.Control) != 0;
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;
}

veuillez ne pas supprimer ce commentaire

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 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;
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top