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? 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);
}
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
- Ustaw
KeyPreview
Na True -
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(); } }
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.
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...
}
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.
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();
}
}
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/
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;
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;
}
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
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;
}
}
}
}
}
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