控件上的Windows窗体键盘快捷键

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了控件上的Windows窗体键盘快捷键相关的知识,希望对你有一定的参考价值。

Easily create Windows Forms Shortcuts with this class.

For example: A shortcut to catch pasting via Ctrl + V.
Shortcut sc = new Shortcut(this, new Action(() => MessageBox.Show("Data pasted!")));
sc.Keys.Add(Keys.ControlKey);
sc.Keys.Add(Keys.V);
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4.  
  5. namespace Tools
  6. {
  7. /// <summary>
  8. /// Tasten-Shortcut auf einem Control.
  9. /// </summary>
  10. public class Shortcut
  11. {
  12. /// <summary>
  13. /// Aktuell gedrückte Tasten.
  14. /// </summary>
  15. private List<Keys> _CurrentlyPressedKeys = new List<Keys>();
  16.  
  17. private Control _Control;
  18. private List<Keys> _Keys = new List<Keys>();
  19. private Action _Action;
  20.  
  21. /// <summary>
  22. /// Control, auf dem die Tastendrücke überwacht werden sollen.
  23. /// </summary>
  24. public Control Control
  25. {
  26. get { return _Control; }
  27. set
  28. {
  29. this.OnControlChanging();
  30. _Control = value;
  31. this.OnControlChanged();
  32. }
  33. }
  34.  
  35. /// <summary>
  36. /// Keys, die gedrückt werden müssen, um die Aktion auszulösen.
  37. /// </summary>
  38. public List<Keys> Keys
  39. {
  40. get { return _Keys; }
  41. }
  42.  
  43. /// <summary>
  44. /// Aktion, die ausgelöst werden soll.
  45. /// </summary>
  46. public Action Action
  47. {
  48. get { return _Action; }
  49. set { _Action = value; }
  50. }
  51.  
  52. /// <summary>
  53. /// Initialisiert einen einen Tasten-Shortcut.
  54. /// </summary>
  55. public Shortcut()
  56. {
  57. }
  58.  
  59. /// <summary>
  60. /// Initialisiert einen einen Tasten-Shortcut.
  61. /// </summary>
  62. /// <param name="control">Control, auf dem die Tastendrücke überwacht werden sollen.</param>
  63. public Shortcut(Control control)
  64. {
  65. this.Control = control;
  66. }
  67.  
  68. /// <summary>
  69. /// Initialisiert einen einen Tasten-Shortcut.
  70. /// </summary>
  71. /// <param name="control">Control, auf dem die Tastendrücke überwacht werden sollen.</param>
  72. /// <param name="action">Aktion, die ausgelöst werden soll.</param>
  73. public Shortcut(Control control, Action action)
  74. {
  75. this.Control = control;
  76. this.Action = action;
  77. }
  78.  
  79. /// <summary>
  80. /// Wird aufgerufen, wenn sich die Control-Eigenschaft gerade ändert.
  81. /// </summary>
  82. protected virtual void OnControlChanging()
  83. {
  84. // Abonnements der alten Key-Events entfernen
  85. if (this.Control != null)
  86. {
  87. this.Control.KeyDown -= new KeyEventHandler(Control_KeyDown);
  88. this.Control.KeyUp -= new KeyEventHandler(Control_KeyUp);
  89. }
  90. }
  91.  
  92. /// <summary>
  93. /// Wird aufgerufen, wenn die Control-Eigenschaft geändert wurde.
  94. /// </summary>
  95. protected virtual void OnControlChanged()
  96. {
  97. // Neue Key-Events abonnieren
  98. if (this.Control != null)
  99. {
  100. this.Control.KeyDown += new KeyEventHandler(Control_KeyDown);
  101. this.Control.KeyUp += new KeyEventHandler(Control_KeyUp);
  102. }
  103. }
  104.  
  105. /// <summary>
  106. /// Überprüft, ob die aktuell gedrückten Tasten dem Shortcut entsprechen.
  107. /// </summary>
  108. protected void CheckKeys()
  109. {
  110. bool flag = true;
  111.  
  112. foreach (Keys key in this.Keys)
  113. {
  114. if (!_CurrentlyPressedKeys.Contains(key))
  115. flag = false;
  116. }
  117.  
  118. if (flag)
  119. this.Action();
  120. }
  121.  
  122. /// <summary>
  123. /// Wird aufgerufen, wenn eine Taste auf dem Control gedrückt wurde.
  124. /// </summary>
  125. private void Control_KeyDown(object sender, KeyEventArgs e)
  126. {
  127. // Aktuell gedrückte Taste speichern
  128. _CurrentlyPressedKeys.Add(e.KeyCode);
  129.  
  130. // Auf Shortcut überprüfen
  131. this.CheckKeys();
  132. }
  133.  
  134. /// <summary>
  135. /// Wird aufgerufen, wenn eine Taste auf dem Control losgelassen wurde.
  136. /// </summary>
  137. private void Control_KeyUp(object sender, KeyEventArgs e)
  138. {
  139. // Losgelassene Taste entfernen
  140. _CurrentlyPressedKeys.Remove(e.KeyCode);
  141. }
  142. }
  143. }

以上是关于控件上的Windows窗体键盘快捷键的主要内容,如果未能解决你的问题,请参考以下文章

C# Winform 控件或窗体失去焦点时,获取键盘输入数据(我用winform获取另一个窗口的数据)

C# 上下左右键 切换控件焦点

如何使用 C# 在 Windows 窗体中创建 F1 帮助

vb中如何查询一个窗体上的控件类名

Windows 窗体上的甘特图控件 [关闭]

vb中如何使窗体和控件的相对位置不发生改变