Najlepszy sposób na implementację skrótów klawiszowych w aplikacji Windows Forms?

Szukam najlepszego sposobu na zaimplementowanie popularnych skrótów klawiaturowych Windows (na przykład Ctrl+F, Ctrl+N) w mojej aplikacji Windows Forms W C#.

Aplikacja ma główny formularz, który zawiera wiele form potomnych (po jednym na raz). Gdy użytkownik naciśnie Ctrl+F , chciałbym pokazać niestandardowy formularz wyszukiwania. Formularz wyszukiwania będzie zależał od bieżącego otwartego formularza potomnego w aplikacji.

Myślałem o użyciu coś takiego w zdarzeniu ChildForm_KeyDown :

   if (e.KeyCode == Keys.F && Control.ModifierKeys == Keys.Control)
        // Show search form
Ale to nie działa. Zdarzenie nie odpala się nawet po naciśnięciu klawisza. Jakie jest rozwiązanie?
Author: Peter Mortensen, 2008-12-30

11 answers

Prawdopodobnie zapomniałeś ustawić właściwość KeyPreview formularza Na True. Nadpisanie metody ProcessCmdKey () jest rozwiązaniem ogólnym:

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);
}
 416
Author: Hans Passant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-29 13:47:45

Na Twoim głównym formularzu

  1. Ustaw KeyPreview Na True
  2. Dodaj obsługę zdarzenia KeyDown za pomocą następującego kodu

    private void MainForm_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.Control && e.KeyCode == Keys.N)
        {
            SearchForm searchForm = new SearchForm();
            searchForm.Show();
        }
    }
    
 62
Author: Almir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-29 13:06:48

Najlepszym sposobem jest użycie mnemotechniki menu, tzn. posiadanie wpisów menu w głównym formularzu, które mają przypisany skrót klawiaturowy, który chcesz. Wtedy wszystko inne jest obsługiwane wewnętrznie i wszystko, co musisz zrobić, to zaimplementować odpowiednią akcję, która zostanie wykonana w Click Obsługa zdarzenia tego wpisu menu.

 17
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-30 12:06:27

Możesz nawet spróbować tego przykładu:

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...
}
 11
Author: Shilpa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-30 10:01:41

Jeśli masz menu, zmiana ShortcutKeys właściwości ToolStripMenuItem powinna załatwić sprawę.

Jeśli nie, możesz go utworzyć i ustawić jego właściwość visible Na false.

 8
Author: Corin Blaikie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-07 11:53:24

Odpowiedź Hansa mogłaby być nieco łatwiejsza dla kogoś nowego, więc oto moja wersja.

Nie musisz oszukiwać z KeyPreview, zostaw ją ustawioną na false. Aby użyć poniższego kodu, po prostu wklej go poniżej form1_load i uruchom F5 , aby zobaczyć, jak działa:

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();
    }
}
 4
Author: Abhishek Jha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:14

Z formularza głównego musisz:

  • Upewnij się, że ustawiłeś KeyPreview na true (domyślnie TRUE)
  • Dodaj MainForm_KeyDown (..)- za pomocą którego możesz ustawić tutaj dowolne skróty.

Dodatkowo znalazłem to w google i chciałem podzielić się tym z tymi, którzy nadal szukają odpowiedzi. (dla globalnego)

Myślę, że musisz używać 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
    }
}

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

 4
Author: Juran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-30 10:02:09

W WinForm zawsze możemy uzyskać status klawisza sterującego przez:

bool IsCtrlPressed = (Control.ModifierKeys & Keys.Control) != 0;
 1
Author: s k,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-31 08:30:05
 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;

    }
 0
Author: 122,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 05:07:23
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;
    }
}
}

Proszę nie usuwać tego komentarza

 0
Author: 122,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 05:35:57
    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;
            }
        }

    }
}

}

 -1
Author: 122,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-10 05:50:36