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);