C #의 Windows Forms 응용 프로그램에서 일반적인 Windows 키보드 단축키 (예 : Ctrl+ F, Ctrl+ N) 를 구현하는 가장 좋은 방법을 찾고 있습니다.
이 응용 프로그램에는 많은 하위 양식을 한 번에 하나씩 호스팅하는 기본 양식이 있습니다. 사용자가 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로 설정할 수 있습니다 .
답변
기본 양식에서 다음을 수행해야합니다.
- KeyPreview 를 true로 설정했는지 확인하십시오 (기본적으로 TRUE).
- MainForm_KeyDown (..)을 추가하십시오 -여기에서 원하는 단축키를 설정할 수 있습니다.
또한, 나는 이것을 구글에서 발견했으며 여전히 답을 찾고있는 사람들에게 이것을 공유하고 싶었습니다. (전세계)
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/를 더 읽으십시오 .
답변
Hans의 답변 은이 새로운 사람에게는 조금 더 쉬울 수 있으므로 여기 내 버전이 있습니다.
당신은 바보로 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();
}
}