一般的なWindowsキーボードショートカットを実装するための最良の方法を探しています(たとえば Ctrl+F、 Ctrl+NC#で私の Windowsフォーム アプリケーションで)。
アプリケーションには、多数の子フォーム(一度に1つずつ)をホストするメインフォームがあります。ユーザーがヒットしたとき Ctrl+Fカスタム検索フォームを表示したいのですが。検索フォームは、アプリケーション内の現在の開いている子フォームに依存します。
私はChildForm_KeyDownイベントでこのようなものを使うことを考えていました:
if (e.KeyCode == Keys.F && Control.ModifierKeys == Keys.Control)
// Show search form
しかしこれはうまくいきません。キーを押してもイベントは発生しません。解決策は何ですか?
おそらくフォームの 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);
}
メインフォーム上
KeyPreview
をTrueに設定します次のコードでKeyDownイベントハンドラを追加します。
private void MainForm_KeyDown(object sender, KeyEventArgs e)
{
if (e.Control && e.KeyCode == Keys.N)
{
SearchForm searchForm = new SearchForm();
searchForm.Show();
}
}
最善の方法は、メニューニーモニックを使用することです。つまり、メインフォームに希望のキーボードショートカットが割り当てられたメニューエントリを含めることです。それから他のすべては内部的に処理され、あなたがしなければならないのはそのメニューエントリのClick
イベントハンドラで実行される適切なアクションを実装することだけです。
あなたもこの例を試すことができます:
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...
}
あなたがメニューを持っているならば、ShortcutKeys
のToolStripMenuItem
プロパティを変更することはトリックをするべきです。
そうでない場合は、作成してvisible
プロパティをfalseに設定します。
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();
}
}
メインフォームから、次の作業を行います。
さらに、私はこれを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/
WinFormでは、コントロールキーのステータスをいつでも取得できます。
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;
}
このコメントを削除しないでください
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;
}