diff --git a/CADShared/ExtensionMethod/SingleKeyWordHook.cs b/CADShared/ExtensionMethod/SingleKeyWordHook.cs index c18a9166002be59ea963c34bc8ff3082a32f5b99..7570f4be3005080e5fc704eb28c37f3dea1d9b4f 100644 --- a/CADShared/ExtensionMethod/SingleKeyWordHook.cs +++ b/CADShared/ExtensionMethod/SingleKeyWordHook.cs @@ -1,4 +1,4 @@ -using Keys = System.Windows.Forms.Keys; +using Keys = System.Windows.Forms.Keys; namespace IFoxCAD.Cad; @@ -84,11 +84,9 @@ public void AddKeys(KeywordCollection keywordCollection) { foreach (Keyword item in keywordCollection) { - if (item.LocalName.Length == 1) - { - var k = (Keys)item.LocalName[0]; - _keyWords.Add(k); - } + if (item.LocalName.Length != 1) continue; + var k = (Keys)item.LocalName[0]; + _keyWords.Add(k); } } @@ -108,6 +106,7 @@ public void AddKeys(KeywordCollection keywordCollection) /// public void Reset() { + _key = Keys.None; _isResponsed = false; } @@ -135,35 +134,32 @@ private void Acap_PreTranslateMessage(object sender, PreTranslateMessageEventArg { if (!_working || e.Message.message != 256) return; var tempKey = IntPtr.Size == 4 ? (Keys)e.Message.wParam.ToInt32() : (Keys)e.Message.wParam.ToInt64(); - bool contains = _keyWords.Contains(tempKey); - if (contains || tempKey == Keys.ProcessKey) + var contains = _keyWords.Contains(tempKey); + + if (IsResponsed || !contains) return; + + // 标记为true,表示此按键已经被处理,Windows不会再进行处理 + if (_workType != SingleKeyWordWorkType.ENTER) + { + e.Handled = true; + } + + _key = tempKey; + _isResponsed = true; // 此bool是防止按键被长按时出错 + + switch (_workType) { - // 标记为true,表示此按键已经被处理,Windows不会再进行处理 - if (_workType != SingleKeyWordWorkType.ENTER) - { - e.Handled = true; - } - - if (contains) - _key = tempKey; - if (!_isResponsed) - { - // 此bool是防止按键被长按时出错 - _isResponsed = true; - switch (_workType) - { - case SingleKeyWordWorkType.ESCAPE: - // ESC稳妥一些,但是要判断promptResult的顺序 - KeyBoardSendKey(Keys.Escape); - break; - case SingleKeyWordWorkType.ENTER: - KeyBoardSendKey(Keys.Enter); - break; - case SingleKeyWordWorkType.WRITE_LINE: - Utils.WriteToCommandLine(Convert.ToChar(_key) + _enterStr); - break; - } - } + case SingleKeyWordWorkType.ESCAPE: + // ESC稳妥一些,但是要判断promptResult的顺序 + KeyBoardSendKey(Keys.Escape); + break; + case SingleKeyWordWorkType.ENTER: + KeyBoardSendKey(Keys.Enter); + break; + case SingleKeyWordWorkType.WRITE_LINE: + Utils.SetFocusToDwgView(); // 恢复焦点(前面输入错误时会将焦点移至动态输入框) + Utils.WriteToCommandLine(Convert.ToChar(_key) + _enterStr); + break; } } @@ -177,17 +173,16 @@ private void Acap_PreTranslateMessage(object sender, PreTranslateMessageEventArg public bool IsDisposed { get; private set; } /// - /// + /// 拆除事件 /// - /// + /// 是否清空关键字 private void Dispose(bool disposing) { if (IsDisposed) return; Acap.PreTranslateMessage -= Acap_PreTranslateMessage; - if (disposing) - { + if (disposing) { _keyWords.Clear(); } @@ -195,19 +190,19 @@ private void Dispose(bool disposing) } /// - /// 析够里把事件拆了 + /// 析构里拆除事件 /// ~SingleKeyWordHook() { - Dispose(disposing: false); + Dispose(true); } /// - /// + /// 拆除事件并清空关键字 /// public void Dispose() { - Dispose(disposing: true); + Dispose(true); GC.SuppressFinalize(this); } @@ -242,7 +237,8 @@ public static class SingleKeywordHookEx /// 关键字集合 /// 工作模式 /// 单文本关键字类(需要using) - public static SingleKeyWordHook HookSingleKeyword(this KeywordCollection keywords, SingleKeyWordWorkType workType = SingleKeyWordWorkType.WRITE_LINE) + public static SingleKeyWordHook HookSingleKeyword(this KeywordCollection keywords, + SingleKeyWordWorkType workType = SingleKeyWordWorkType.WRITE_LINE) { var singleKeyWordHook = new SingleKeyWordHook(workType); singleKeyWordHook.AddKeys(keywords);