Frage

Ich bin für einen besten Weg, um gemeinsame Windows-Tastenkombinationen (zum Beispiel implementieren Strg + F , Strg + N ) in meinem Windows Forms Anwendung in C #.

Die Anwendung verfügt über eine Hauptform, die viele Kind Formen (einen nach dem anderen) hostet. Wenn ein Benutzer trifft Strg + F , würde Ich mag eine benutzerdefinierte Suchformular zeigen. Das Suchformular auf der aktuellen offenes Kind Form in der Anwendung abhängen würde.

Ich dachte an so etwas wie dies unter Verwendung des in der ChildForm_KeyDown Veranstaltung:

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

Aber das funktioniert nicht. Die Veranstaltung ist nicht einmal ausgelöst, wenn Sie eine Taste drücken. Was ist die Lösung?

War es hilfreich?

Lösung

Sie haben wahrscheinlich vergessen, das Formular zu setzen KeyPreview Eigenschaft auf True. Überschreiben der ProcessCmdKey () Methode ist die generische Lösung:

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

Andere Tipps

Auf dem Hauptformular

  1. Stellen Sie KeyPreview auf True
  2. Fügen Sie KeyDown Ereignishandler mit dem folgenden Code

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

Der beste Weg ist Menü Mnemotechnik zu verwenden, das heißt Menüeinträge in der Hauptform zu haben, die die Tastenkombination zugewiesen bekommen Sie wollen. Dann alles anderes behandelt werden intern und alles, was Sie tun müssen, ist die entsprechende Aktion zu implementieren, die in den Click Event-Handler dieses Menüeintrags ausgeführt werden.

Sie können auch dieses Beispiel versuchen:

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

Wenn Sie ein Menü dann ShortcutKeys Eigenschaft der ToolStripMenuItem Ändern sollte es tun.

Wenn nicht, könnten Sie eine erstellen und seine visible Eigenschaft auf false.

Hans Antwort ein wenig einfacher für jemand neu in diesem gemacht werden konnte, so ist hier meine Version.

Sie müssen nicht mit KeyPreview täuschen, lassen Sie es zu false gesetzt. Um den Code unten zu verwenden, nur fügen Sie unter Ihrem form1_load und laufen mit F5 um zu sehen, es funktioniert:

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

Im Hauptformular, müssen Sie:

  • Seien Sie sicher, dass Sie KeyPreview true (TRUE Standardeinstellung)
  • Fügen Sie MainForm_KeyDown (...) -, mit denen Sie setzen hier alle Verknüpfungen, die Sie wünschen

Zusätzlich habe ich dies auf Google gefunden und ich wollte das die teilen, die nach Antworten noch auf der Suche sind. (Für global)

Ich glaube, Sie haben user32.dll werden mit

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

Weitere lesen Sie die

In WinForms, können wir immer die Strg-Taste Status erhalten durch:

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

Bitte nicht löschen dieser Kommentar

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;
        }
    }
}
scroll top