diff --git a/Ink Canvas/Helpers/FloatingWindowInterceptor.cs b/Ink Canvas/Helpers/FloatingWindowInterceptor.cs index 3eed2067..1e0e9d10 100644 --- a/Ink Canvas/Helpers/FloatingWindowInterceptor.cs +++ b/Ink Canvas/Helpers/FloatingWindowInterceptor.cs @@ -910,6 +910,27 @@ namespace Ink_Canvas.Helpers #region 私有方法 + /// + /// 清理无效的窗口句柄 + /// + private void CleanupInvalidWindows() + { + var invalidWindows = new List(); + + foreach (var kvp in _interceptedWindows) + { + var hWnd = kvp.Key; + if (!IsWindow(hWnd)) + { + invalidWindows.Add(hWnd); + } + } + foreach (var hWnd in invalidWindows) + { + _interceptedWindows.Remove(hWnd); + } + } + private void ScanForWindows(object state) { if (!_isRunning) return; @@ -918,6 +939,7 @@ namespace Ink_Canvas.Helpers { // 简化的扫描逻辑 var interceptedCount = 0; + CleanupInvalidWindows(); // 重置所有规则的发现状态 foreach (var rule in _interceptRules.Values) @@ -936,7 +958,10 @@ namespace Ink_Canvas.Helpers { if (rule.IsEnabled && rule.foundHwnd && rule.outHwnd != IntPtr.Zero) { - if (!_interceptedWindows.ContainsKey(rule.outHwnd)) + bool shouldIntercept = !_interceptedWindows.ContainsKey(rule.outHwnd) || + (_interceptedWindows.ContainsKey(rule.outHwnd) && IsWindowVisible(rule.outHwnd)); + + if (shouldIntercept) { InterceptWindow(rule.outHwnd, rule); interceptedCount++; @@ -1124,7 +1149,6 @@ namespace Ink_Canvas.Helpers private bool MatchesRule(WindowInfo windowInfo, InterceptRule rule) { - // 保留旧方法用于兼容性 return MatchesRulePrecise(windowInfo.Handle, rule); } @@ -1132,6 +1156,15 @@ namespace Ink_Canvas.Helpers { try { + if (!IsWindow(hWnd) || !IsWindowVisible(hWnd)) + { + if (_interceptedWindows.ContainsKey(hWnd)) + { + _interceptedWindows.Remove(hWnd); + } + return; + } + // 直接隐藏窗口,不发送关闭消息 ShowWindow(hWnd, SW_HIDE);