From b0d28bd4335b47cbbef4b144a448ed697c72b8be Mon Sep 17 00:00:00 2001 From: yupeng_dyp Date: Sat, 15 Jun 2024 11:20:58 +0000 Subject: [PATCH] =?UTF-8?q?update=20CADShared/ExtensionMethod/SingleKeyWor?= =?UTF-8?q?dHook.cs.=20=E4=BC=98=E5=8C=96=E4=BD=BF=E7=94=A8=E4=BD=93?= =?UTF-8?q?=E9=AA=8C=EF=BC=88=E6=81=A2=E5=A4=8D=E7=84=A6=E7=82=B9=EF=BC=8C?= =?UTF-8?q?=E5=88=A0=E9=99=A4=20Keys.ProcessKey=20=E5=88=A4=E6=96=AD?= =?UTF-8?q?=E6=84=9F=E8=A7=89=E6=B2=A1=E6=9C=89=E5=BF=85=E8=A6=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: yupeng_dyp --- .../ExtensionMethod/SingleKeyWordHook.cs | 84 +++++++++---------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/CADShared/ExtensionMethod/SingleKeyWordHook.cs b/CADShared/ExtensionMethod/SingleKeyWordHook.cs index c18a916..087015c 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,34 @@ 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 (!contains) return; + + // 标记为true,表示此按键已经被处理,Windows不会再进行处理 + if (_workType != SingleKeyWordWorkType.ENTER) { - // 标记为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; - } - } + e.Handled = true; + } + + if (IsResponsed) return; //放 e.Handled 后是避免在非 ENTER 模式时长按造成动态输入框偶发性闪现关键字以至轻微卡顿问题 + + _key = tempKey; + _isResponsed = true; // 此bool是防止按键被长按时出错 + + switch (_workType) + { + 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 +175,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 +192,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 +239,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); -- Gitee