HotKey.cs
上传用户:szltgg
上传日期:2019-05-16
资源大小:604k
文件大小:6k
源码类别:

Telnet服务器

开发平台:

C#

  1. /*
  2. * Copyright (c) 2005 Poderosa Project, All Rights Reserved.
  3. * $Id: HotKey.cs,v 1.2 2005/04/20 08:45:45 okajima Exp $
  4. */
  5. using System;
  6. using System.Text;
  7. using System.Diagnostics;
  8. using System.Collections;
  9. using System.ComponentModel;
  10. using System.Drawing;
  11. using System.Windows.Forms;
  12. using Poderosa.UI;
  13. namespace Poderosa.Forms
  14. {
  15. /*
  16.  * 儂僢僩僉乕僐儞僩儘乕儖巄掕斉
  17.  * 
  18.  * 僉乕傪師偺係庬椶偵嬫暿偡傞丅
  19.  * 1. ModifierKey: Ctrl, Shift, Alt丅壗偐偲慻傒崌傢偣傞僉乕丅
  20.  * 2. CharKey: 暥帤偲娭楢晅偗傜傟偨僉乕丅僥儞僉乕,僗儁乕僗娷傓丅
  21.  * 3. TerminalKey: 僞乕儈僫儖偵偲偭偰堄枴偺偁傞僉乕丅Enter,BS,ESC,Tab,僇乕僜儖僉乕,僼傽儞僋僔儑儞僉乕丅
  22.  * 4. GenericKey:  偦偺懠偺僉乕
  23.  * 
  24.  * 儂僢僩僉乕偵桳岠側擖椡偼modifier偵傛傝堎側傝丄
  25.  * modifier側偟偐Shift偺傒丗4偺傒
  26.  * Control傑偨偼Alt偁傝丗 2,3,4
  27.  * 偲側傞丅
  28.  * 
  29.  * 妋擣嵪傒夦尰徾丗Shift+F4, Control+F10偱曄側僉乕偑棃傞
  30.  * 
  31.  * 僨僶僢僌僆僾僔儑儞偱丄棃偨僉乕偺儕僗僩傪儕僗僩儃僢僋僗偁偨傝偵僟儞僾偡傞婡擻偑偁傞偲傛偄偩傠偆丅
  32. */
  33. /// <summary>
  34. /// HotKey 偺奣梫偺愢柧偱偡丅
  35. /// </summary>
  36. internal class HotKey : System.Windows.Forms.TextBox
  37. {
  38. /// <summary>
  39. /// 昁梫側僨僓僀僫曄悢偱偡丅
  40. /// </summary>
  41. private System.ComponentModel.Container components = null;
  42. private TextBox _debugTextBox;
  43. private Keys _key;
  44. public HotKey()
  45. {
  46. // 偙偺屇傃弌偟偼丄Windows.Forms 僼僅乕儉 僨僓僀僫偱昁梫偱偡丅
  47. InitializeComponent();
  48. // TODO: InitForm 傪屇傃弌偟偺屻偵弶婜壔張棟傪捛壛偟傑偡丅
  49. }
  50. public TextBox DebugTextBox {
  51. get {
  52. return _debugTextBox;
  53. }
  54. set {
  55. _debugTextBox = value;
  56. }
  57. }
  58. public Keys Key {
  59. get {
  60. return _key;
  61. }
  62. set {
  63. _key = value;
  64. Text = FormatKey(value);
  65. }
  66. }
  67. /// <summary>
  68. /// 巊梡偝傟偰偄傞儕僜乕僗偵屻張棟傪幚峴偟傑偡丅
  69. /// </summary>
  70. protected override void Dispose( bool disposing )
  71. {
  72. if( disposing )
  73. {
  74. if(components != null)
  75. {
  76. components.Dispose();
  77. }
  78. }
  79. base.Dispose( disposing );
  80. }
  81. #region Component Designer generated code
  82. /// <summary>
  83. /// 僨僓僀僫 僒億乕僩偵昁梫側儊僜僢僪偱偡丅偙偺儊僜僢僪偺撪梕傪
  84. /// 僐乕僪 僄僨傿僞偱曄峏偟側偄偱偔偩偝偄丅
  85. /// </summary>
  86. private void InitializeComponent()
  87. {
  88. components = new System.ComponentModel.Container();
  89. this.ImeMode = ImeMode.Disable;
  90. }
  91. #endregion
  92. protected override bool IsInputKey(Keys key) {
  93. return false;
  94. }
  95. protected override void OnKeyUp(KeyEventArgs args) {
  96. base.OnKeyUp(args);
  97. Keys body = _key & Keys.KeyCode;
  98. if(body==Keys.Menu || body==Keys.ShiftKey || body==Keys.ControlKey) { //modifier偺傒偼擣傔側偄
  99. _key = Keys.None;
  100. this.Text = "";
  101. }
  102. }
  103. protected override bool ProcessDialogKey(Keys key) {
  104. if(_debugTextBox!=null) AppendDebugText(key.ToString()+" "+(int)key);
  105. string t = FormatKey(key);
  106. if(t!=null) {
  107. this.Text = t;
  108. }
  109. else
  110. _key = Keys.None;
  111. return true;
  112. }
  113. private string FormatKey(Keys key) {
  114. Keys body = key & Keys.KeyCode;
  115. Keys modifiers = key & Keys.Modifiers;
  116. //modifier偼忢偵昞帵偡傞
  117. StringBuilder b = new StringBuilder();
  118. if((modifiers & Keys.Control)!=Keys.None) {
  119. b.Append("Ctrl");
  120. }
  121. if((modifiers & Keys.Shift)!=Keys.None) {
  122. if(b.Length>0) b.Append('+');
  123. b.Append("Shift");
  124. }
  125. if((modifiers & Keys.Alt)!=Keys.None) {
  126. if(b.Length>0) b.Append('+');
  127. b.Append("Alt");
  128. }
  129. if(b.Length>0)
  130. b.Append('+');
  131. if(IsCharKey(body)) {
  132. if(modifiers!=Keys.None && modifiers!=Keys.Shift) {
  133. if(modifiers==Keys.Alt && (Keys.D0 <= body && body <= Keys.D9))
  134. _key = Keys.None;
  135. else {
  136. b.Append(UILibUtil.KeyString(body));
  137. _key = key;
  138. }
  139. }
  140. else
  141. _key = Keys.None;
  142. }
  143. else if(IsTerminalKey(body)) {
  144. if(modifiers!=Keys.None) {
  145. //僇僗僞儅僀僘晄擻偱屌掕偝傟偨僔儑乕僩僇僢僩僉乕偼搊榐偱偒側偄
  146. if(modifiers==Keys.Control && IsScrollKey(body))
  147. _key = Keys.None;
  148. else {
  149. b.Append(UILibUtil.KeyString(body));
  150. _key = key;
  151. }
  152. }
  153. else
  154. _key = Keys.None;
  155. }
  156. else if(IsFunctionKey(body)) {
  157. b.Append(UILibUtil.KeyString(body));
  158. _key = key;
  159. }
  160. else if(!IsModifierKey(body)) {
  161. _key = Keys.None;
  162. }
  163. return b.ToString();
  164. }
  165. private static bool IsCharKey(Keys key) {
  166. int n = (int)key;
  167. return ((int)Keys.A <= n && n <= (int)Keys.Z) ||
  168. ((int)Keys.D0 <= n && n <= (int)Keys.D9) ||
  169. ((int)Keys.NumPad0 <= n && n <= (int)Keys.NumPad9) ||
  170. ((int)Keys.OemSemicolon <=n && n <= (int)Keys.Oemtilde) ||
  171. ((int)Keys.OemOpenBrackets <=n && n <= (int)Keys.OemQuotes) ||
  172. key==Keys.Divide || key==Keys.Multiply || key==Keys.Subtract || key==Keys.Add || key==Keys.Decimal ||
  173. key==Keys.Space || key==Keys.Enter;
  174. }
  175. private static bool IsModifierKey(Keys key) {
  176. return key==Keys.Menu || key==Keys.ShiftKey || key==Keys.ControlKey ||
  177. key==Keys.LMenu || key==Keys.RMenu ||
  178. key==Keys.LShiftKey || key==Keys.RShiftKey ||
  179. key==Keys.LControlKey || key==Keys.RControlKey;
  180. }
  181. private static bool IsFunctionKey(Keys key) {
  182. return (int)Keys.F1 <= (int)key && (int)key <= (int)Keys.F24;
  183. }
  184. private static bool IsTerminalKey(Keys key) {
  185. return key==Keys.Escape || key==Keys.Back || key==Keys.Tab ||
  186. key==Keys.Up || key==Keys.Down || key==Keys.Left || key==Keys.Right ||
  187. ((int)Keys.F1 <= (int)key && (int)key <= (int)Keys.F12) || 
  188. key==Keys.Home || key==Keys.End || key==Keys.Next || key==Keys.Prior || key==Keys.PageDown || key==Keys.PageUp ||
  189. key==Keys.Insert || key==Keys.Delete;
  190. }
  191. private static bool IsScrollKey(Keys key) { //TerminalKey偺僒僽僙僢僩偱丄Ctrl偲偺慻傒崌傢偣偱僶僢僼傽偺僗僋儘乕儖傪偡傞
  192. return key==Keys.Up || key==Keys.Down ||
  193. key==Keys.Home || key==Keys.End ||
  194. key==Keys.PageDown || key==Keys.PageUp;
  195. }
  196. private void AppendDebugText(string text) {
  197. string[] data = _debugTextBox.Lines;
  198. if(data.Length>=5) {
  199. string[] n = new string[5];
  200. Array.Copy(data, data.Length-4, n, 0, 4);
  201. n[4] = text;
  202. _debugTextBox.Lines = n;
  203. }
  204. else {
  205. string[] n = new string[data.Length+1];
  206. Array.Copy(data, 0, n, 0, data.Length);
  207. n[data.Length] = text;
  208. _debugTextBox.Lines = n;
  209. }
  210. }
  211. }
  212. }