web-dev-qa-db-ja.com

Windowsフォームアプリケーションにキーボードショートカットを実装するための最良の方法は?

一般的なWindowsキーボードショートカットを実装するための最良の方法を探しています(たとえば Ctrl+F、 Ctrl+NC#で私の Windowsフォーム アプリケーションで)。

アプリケーションには、多数の子フォーム(一度に1つずつ)をホストするメインフォームがあります。ユーザーがヒットしたとき Ctrl+Fカスタム検索フォームを表示したいのですが。検索フォームは、アプリケーション内の現在の開いている子フォームに依存します。

私はChildForm_KeyDownイベントでこのようなものを使うことを考えていました:

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

しかしこれはうまくいきません。キーを押してもイベントは発生しません。解決策は何ですか?

265
Rockcoder

おそらくフォームの KeyPreview プロパティをTrueに設定するのを忘れていました。 ProcessCmdKey() メソッドをオーバーライドするのが一般的な解決策です。

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);
}
440
Hans Passant

メインフォーム上

  1. KeyPreviewをTrueに設定します
  2. 次のコードでKeyDownイベントハンドラを追加します。

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

最善の方法は、メニューニーモニックを使用することです。つまり、メインフォームに希望のキーボードショートカットが割り当てられたメニューエントリを含めることです。それから他のすべては内部的に処理され、あなたがしなければならないのはそのメニューエントリのClickイベントハンドラで実行される適切なアクションを実装することだけです。

19
Konrad Rudolph

あなたもこの例を試すことができます:

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
Shilpa

あなたがメニューを持っているならば、ShortcutKeysToolStripMenuItemプロパティを変更することはトリックをするべきです。

そうでない場合は、作成してvisibleプロパティをfalseに設定します。

8
Corin Blaikie

Hans's answer これに慣れていない人にとっては、もう少し簡単にできます。だから私のバージョンです。

あなたはKeyPreviewをだます必要はありません。falseに設定したままにしてください。以下のコードを使用するには、form1_loadの下に貼り付けてから実行してください。 F5 それが機能するのを見るために:

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
Abhishek Jha

メインフォームから、次の作業を行います。

  • 必ずKeyPreviewtrueに設定してください(デフォルトではTRUE)。
  • MainForm_KeyDown(..)を追加します。これによって、必要なショートカットをここで設定できます。

さらに、私はこれをGoogleで見つけました、そしてまだ答えを探している人にこれを共有したいと思いました。 (グローバル用)

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

これをさらに読みなさい http://www.fluxbytes.com/csharp/how-to-register-a-global-hotkey-for-your-application-in-c/

4
Juran

WinFormでは、コントロールキーのステータスをいつでも取得できます。

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

このコメントを削除しないでください

0
122
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
122