C# 如何在.NET中创建键盘快捷键
我有一个C#/.NET中的Windows应用程序。我需要制作一些键盘快捷键来在不同的窗体之间导航。如何在.NET中创建键盘快捷键?您可以处理Control.KeyPress事件并检查组合键以创建键盘快捷键:我假设您试图实现C# 如何在.NET中创建键盘快捷键,c#,.net,keyboard-shortcuts,C#,.net,Keyboard Shortcuts,我有一个C#/.NET中的Windows应用程序。我需要制作一些键盘快捷键来在不同的窗体之间导航。如何在.NET中创建键盘快捷键?您可以处理Control.KeyPress事件并检查组合键以创建键盘快捷键:我假设您试图实现控件?键入快捷键,就像复制和粘贴一样 您可以创建附加到每个表单的通用KeyDown和keydup处理程序。每次你得到一个KeyDown键时,将该键存储在一个列表中(以说明按住一个键并敲击另一个键的原因)。每次向列表中添加键时,请检查列表中是否包含任何快捷键组合。如果是这样,执行
控件?
键入快捷键,就像复制和粘贴一样
您可以创建附加到每个表单的通用KeyDown
和keydup
处理程序。每次你得到一个KeyDown
键时,将该键存储在一个列表中(以说明按住一个键并敲击另一个键的原因)。每次向列表中添加键时,请检查列表中是否包含任何快捷键组合。如果是这样,执行您需要的任何代码
对于每个KeyUp
事件,确保您正在从列表中删除(您只需要检查KeyUp
添加上的快捷方式
编辑:进行了快速搜索,发现实施了相同的解决方案:
class KeyboardShortcuts
{
public static void Window_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
if (m_keysDownList.Contains(e.Key) == false)
{
m_keysDownList.Add(e.Key);
Debug.WriteLine(e.Key.ToString() + " Down");
}
CheckForKeyCombos();
}
public static void Window_KeyUp(object sender, System.Windows.Input.KeyEventArgs e)
{
m_keysDownList.Remove(e.Key);
Debug.WriteLine(e.Key.ToString() + " Up");
}
public static void CheckForKeyCombos()
{
if (m_keysDownList.Contains(System.Windows.Input.Key.LeftCtrl))
{
if (m_keysDownList.Contains(System.Windows.Input.Key.A))
{
if (m_keysDownList.Contains(System.Windows.Input.Key.C))
{
// Clear list before handeling ( Dialogue boxes
// can hinder the listening for key up events, leaving
// keys in list - so clear first ).
ClearKeysDownList();
// Handle Ctrl + A + C Combo
HandleCtrlACCombo();
}
}
}
}
private static void ClearKeysDownList()
{
m_keysDownList.Clear();
}
public static void HandleCtrlACCombo()
{
if (handleCtrlACComboDelegate != null)
{
handleCtrlACComboDelegate();
}
}
// Need a delegate instance for each combo
public delegate void HandleCtrlACComboDelegate();
public static HandleCtrlACComboDelegate handleCtrlACComboDelegate;
private static List<System.Windows.Input.Key> m_keysDownList = new List<System.Windows.Input.Key>();
}
class键盘快捷键
{
public static void Window_KeyDown(对象发送器,System.Windows.Input.KeyEventArgs e)
{
if(m_keysDownList.Contains(e.Key)=false)
{
m_keys downlist.Add(e.Key);
Debug.WriteLine(e.Key.ToString()+“Down”);
}
CheckForKeyCombos();
}
公共静态无效窗口\u KeyUp(对象发送方,System.Windows.Input.KeyEventArgs e)
{
m_keys downlist.Remove(e.Key);
Debug.WriteLine(e.Key.ToString()+“Up”);
}
公共静态void CheckForKeyCombos()
{
if(m_keysDownList.Contains(System.Windows.Input.Key.LeftCtrl))
{
if(m_keysDownList.Contains(System.Windows.Input.Key.A))
{
if(m_keysDownList.Contains(System.Windows.Input.Key.C))
{
//处理前清除列表(对话框
//可能会妨碍监听按键事件,离开
//列表中的键-请先清除)。
ClearKeysDownList();
//句柄Ctrl+A+C组合键
Handelectrocombo();
}
}
}
}
私有静态void ClearKeysDownList()
{
m_keysDownList.Clear();
}
公共静态无效HandElectrocombo()
{
如果(HandElectrocomboDelegate!=null)
{
handlectrocombodelegate();
}
}
//每个组合都需要一个委托实例
公共委托void handlelecombodelegate();
公共静态handlectrocombodelegate handlectrocombodelegate;
私有静态列表m_keysDownList=新列表();
}
您可以看到引用的完整解决方案(只需滚动到底部,因为它位于我们不知道名称的邪恶网站上。您可以使用p/Invoke。如果您不想要全局性的东西,您可以始终以所有形式处理按键事件。这些事情通常使用windows挂钩来完成。下面是一篇MSDN文章,介绍如何使用它们:
如果父窗体具有用户选择打开子窗体的按钮或菜单,则可以通过在.Text属性中添加一个符号和
&
来添加一个非常简单的热键
例如,如果您有一个按钮,例如Options
,您可以按如下方式更改其文本:&Options
。这样做将使Alt+O从父窗体激活该按钮
或者,如果您希望热键(如Ctrl+O)打开表单,则必须订阅主表单的KeyDown
事件,并查找该组合键:
private void FormMain_KeyDown(object sender, KeyEventArgs e)
{
if (ModifierKeys == Keys.Control && e.KeyCode == Keys.O))
// open form
}
请注意,您可能需要将表单的KeyPreview
属性设置为True
最后,工具条菜单项有一个属性ShortcutKeys
,您可以在属性面板中定义该属性,VS将自动向设计器文件添加所需的代码,以支持激活菜单项的键盘快捷键。步骤1设置
KeyPreview = True;
第2步
if (e.Alt && e.KeyCode == Keys.C)
{
//your function
}
请扩大你的答案。