From 56fb29fe159864f9f51785ec2715ed7e3083a932 Mon Sep 17 00:00:00 2001
From: CJKmkp <2564608840@qq.com>
Date: Fri, 2 Jan 2026 09:28:00 +0800
Subject: [PATCH] =?UTF-8?q?improve:=E8=87=AA=E5=8A=A8=E6=94=B6=E7=BA=B3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Ink Canvas/MainWindow_cs/MW_Timer.cs | 480 ++++++++++++++-------------
1 file changed, 245 insertions(+), 235 deletions(-)
diff --git a/Ink Canvas/MainWindow_cs/MW_Timer.cs b/Ink Canvas/MainWindow_cs/MW_Timer.cs
index 9126ad09..66405895 100644
--- a/Ink Canvas/MainWindow_cs/MW_Timer.cs
+++ b/Ink Canvas/MainWindow_cs/MW_Timer.cs
@@ -1,6 +1,5 @@
using Ink_Canvas.Helpers;
using System;
-using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
@@ -14,7 +13,6 @@ using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
-using WinForms = System.Windows.Forms;
namespace Ink_Canvas
{
@@ -59,18 +57,18 @@ namespace Ink_Canvas
public partial class MainWindow : Window
{
- private System.Timers.Timer timerCheckPPT = new System.Timers.Timer();
- private System.Timers.Timer timerKillProcess = new System.Timers.Timer();
- private System.Timers.Timer timerCheckAutoFold = new System.Timers.Timer();
+ private Timer timerCheckPPT = new Timer();
+ private Timer timerKillProcess = new Timer();
+ private Timer timerCheckAutoFold = new Timer();
private string AvailableLatestVersion;
- private System.Timers.Timer timerCheckAutoUpdateWithSilence = new System.Timers.Timer();
- private System.Timers.Timer timerCheckAutoUpdateRetry = new System.Timers.Timer();
+ private Timer timerCheckAutoUpdateWithSilence = new Timer();
+ private Timer timerCheckAutoUpdateRetry = new Timer();
private bool isHidingSubPanelsWhenInking; // 避免书写时触发二次关闭二级菜单导致动画不连续
private int updateCheckRetryCount = 0;
private const int MAX_UPDATE_CHECK_RETRIES = 6;
- private System.Timers.Timer timerDisplayTime = new System.Timers.Timer();
- private System.Timers.Timer timerDisplayDate = new System.Timers.Timer();
- private System.Timers.Timer timerNtpSync = new System.Timers.Timer();
+ private Timer timerDisplayTime = new Timer();
+ private Timer timerDisplayDate = new Timer();
+ private Timer timerNtpSync = new Timer();
private TimeViewModel nowTimeVM = new TimeViewModel();
private DateTime cachedNetworkTime = DateTime.Now;
@@ -509,21 +507,251 @@ namespace Ink_Canvas
return windowTitle.Length == 0 && windowRect.Height < 500;
}
+ ///
+ /// 使用窗口预览模型检测前台窗口是否符合自动收纳要求(仅用于检测,不执行任何操作)
+ ///
+ /// 如果符合自动收纳要求返回true,否则返回false
+ private bool CheckShouldAutoFoldByWindowPreview()
+ {
+ if (_windowOverviewModel == null) return false;
+
+ try
+ {
+ // 从窗口预览模型中获取窗口列表(已按ZOrder排序,最上层在前)
+ var windows = _windowOverviewModel.Windows;
+ if (windows == null || windows.Count == 0) return false;
+
+ // 获取前台窗口(ZOrder最小的窗口,即最上层)
+ var foregroundWindow = windows.FirstOrDefault();
+ if (foregroundWindow == null) return false;
+
+ var windowProcessName = foregroundWindow.ProcessName;
+ var windowTitle = foregroundWindow.Title;
+ var windowRect = foregroundWindow.Rect;
+
+ // 检查EasiNote
+ if (windowProcessName == "EasiNote")
+ {
+ if (foregroundWindow.ProcessPath != "Unknown")
+ {
+ try
+ {
+ var versionInfo = FileVersionInfo.GetVersionInfo(foregroundWindow.ProcessPath);
+ string version = versionInfo.FileVersion;
+ string prodName = versionInfo.ProductName;
+
+ if (version.StartsWith("5.") && Settings.Automation.IsAutoFoldInEasiNote)
+ {
+ bool isAnnotationWindow = windowTitle.Length == 0 && windowRect.Height < 500;
+ if (Settings.Automation.IsAutoFoldInEasiNoteIgnoreDesktopAnno && isAnnotationWindow)
+ {
+ return true;
+ }
+ else if (!isAnnotationWindow)
+ {
+ return true;
+ }
+ }
+ else if (version.StartsWith("3.") && Settings.Automation.IsAutoFoldInEasiNote3)
+ {
+ return true;
+ }
+ else if (prodName.Contains("3C") && Settings.Automation.IsAutoFoldInEasiNote3C &&
+ windowRect.Height >= SystemParameters.WorkArea.Height - 16 &&
+ windowRect.Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ return true;
+ }
+ }
+ catch { }
+ }
+ }
+ // 检查EasiCamera
+ else if (Settings.Automation.IsAutoFoldInEasiCamera && windowProcessName == "EasiCamera" &&
+ windowRect.Height >= SystemParameters.WorkArea.Height - 16 &&
+ windowRect.Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ return true;
+ }
+ // 检查EasiNote5C
+ else if (Settings.Automation.IsAutoFoldInEasiNote5C && windowProcessName == "EasiNote5C" &&
+ windowRect.Height >= SystemParameters.WorkArea.Height - 16 &&
+ windowRect.Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ return true;
+ }
+ // 检查SeewoPinco
+ else if (Settings.Automation.IsAutoFoldInSeewoPincoTeacher &&
+ (windowProcessName == "BoardService" || windowProcessName == "seewoPincoTeacher"))
+ {
+ return true;
+ }
+ // 检查HiteCamera
+ else if (Settings.Automation.IsAutoFoldInHiteCamera && windowProcessName == "HiteCamera" &&
+ windowRect.Height >= SystemParameters.WorkArea.Height - 16 &&
+ windowRect.Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ return true;
+ }
+ // 检查HiteTouchPro
+ else if (Settings.Automation.IsAutoFoldInHiteTouchPro && windowProcessName == "HiteTouchPro" &&
+ windowRect.Height >= SystemParameters.WorkArea.Height - 16 &&
+ windowRect.Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ return true;
+ }
+ // 检查WxBoardMain
+ else if (Settings.Automation.IsAutoFoldInWxBoardMain && windowProcessName == "WxBoardMain" &&
+ windowRect.Height >= SystemParameters.WorkArea.Height - 16 &&
+ windowRect.Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ return true;
+ }
+ // 检查MSWhiteboard
+ else if (Settings.Automation.IsAutoFoldInMSWhiteboard &&
+ (windowProcessName == "MicrosoftWhiteboard" || windowProcessName == "msedgewebview2"))
+ {
+ return true;
+ }
+ // 检查OldZyBoard
+ else if (Settings.Automation.IsAutoFoldInOldZyBoard &&
+ (WinTabWindowsChecker.IsWindowExisted("WhiteBoard - DrawingWindow") ||
+ WinTabWindowsChecker.IsWindowExisted("InstantAnnotationWindow")))
+ {
+ return true;
+ }
+ // 检查HiteLightBoard
+ else if (Settings.Automation.IsAutoFoldInHiteLightBoard && windowProcessName == "HiteLightBoard" &&
+ windowRect.Height >= SystemParameters.WorkArea.Height - 16 &&
+ windowRect.Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ return true;
+ }
+ // 检查AdmoxWhiteboard
+ else if (Settings.Automation.IsAutoFoldInAdmoxWhiteboard && windowProcessName == "Amdox.WhiteBoard" &&
+ windowRect.Height >= SystemParameters.WorkArea.Height - 16 &&
+ windowRect.Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ return true;
+ }
+ // 检查AdmoxBooth
+ else if (Settings.Automation.IsAutoFoldInAdmoxBooth && windowProcessName == "Amdox.Booth" &&
+ windowRect.Height >= SystemParameters.WorkArea.Height - 16 &&
+ windowRect.Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ return true;
+ }
+ // 检查QPoint
+ else if (Settings.Automation.IsAutoFoldInQPoint && windowProcessName == "QPoint" &&
+ windowRect.Height >= SystemParameters.WorkArea.Height - 16 &&
+ windowRect.Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ return true;
+ }
+ // 检查YiYunVisualPresenter
+ else if (Settings.Automation.IsAutoFoldInYiYunVisualPresenter && windowProcessName == "YiYunVisualPresenter" &&
+ windowRect.Height >= SystemParameters.WorkArea.Height - 16 &&
+ windowRect.Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ return true;
+ }
+ // 检查MaxHubWhiteboard
+ else if (Settings.Automation.IsAutoFoldInMaxHubWhiteboard && windowProcessName == "WhiteBoard" &&
+ WinTabWindowsChecker.IsWindowExisted("白板书写") &&
+ windowRect.Height >= SystemParameters.WorkArea.Height - 16 &&
+ windowRect.Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ if (foregroundWindow.ProcessPath != "Unknown")
+ {
+ try
+ {
+ var versionInfo = FileVersionInfo.GetVersionInfo(foregroundWindow.ProcessPath);
+ var version = versionInfo.FileVersion;
+ var prodName = versionInfo.ProductName;
+ if (version.StartsWith("6.") && prodName == "WhiteBoard")
+ {
+ return true;
+ }
+ }
+ catch { }
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ LogHelper.WriteLogToFile($"窗口预览模型检测失败: {ex.Message}", LogHelper.LogType.Error);
+ }
+
+ return false;
+ }
+
private void timerCheckAutoFold_Elapsed(object sender, ElapsedEventArgs e)
{
if (isFloatingBarChangingHideMode) return;
try
{
- // 优先使用窗口概览模型进行检测
- if (_windowOverviewModel != null)
+ bool shouldAutoFold = CheckShouldAutoFoldByWindowPreview();
+ var windowProcessName = ForegroundWindowInfo.ProcessName();
+ var windowTitle = ForegroundWindowInfo.WindowTitle();
+
+ if (shouldAutoFold)
{
- CheckAutoFoldWithWindowOverviewModel();
+ if (windowProcessName == "EasiNote")
+ {
+ if (ForegroundWindowInfo.ProcessPath() != "Unknown")
+ {
+ var versionInfo = FileVersionInfo.GetVersionInfo(ForegroundWindowInfo.ProcessPath());
+ string version = versionInfo.FileVersion;
+ string prodName = versionInfo.ProductName;
+
+ if (version.StartsWith("5.") && Settings.Automation.IsAutoFoldInEasiNote)
+ {
+ bool isAnnotationWindow = windowTitle.Length == 0 && ForegroundWindowInfo.WindowRect().Height < 500;
+ if (Settings.Automation.IsAutoFoldInEasiNoteIgnoreDesktopAnno && isAnnotationWindow)
+ {
+ if (!isFloatingBarFolded) FoldFloatingBar_MouseUp(null, null);
+ }
+ else if (!isAnnotationWindow)
+ {
+ if (!unfoldFloatingBarByUser && !isFloatingBarFolded) FoldFloatingBar_MouseUp(null, null);
+ }
+ }
+ else if (version.StartsWith("3.") && Settings.Automation.IsAutoFoldInEasiNote3)
+ {
+ if (!unfoldFloatingBarByUser && !isFloatingBarFolded) FoldFloatingBar_MouseUp(null, null);
+ }
+ else if (prodName.Contains("3C") && Settings.Automation.IsAutoFoldInEasiNote3C &&
+ ForegroundWindowInfo.WindowRect().Height >= SystemParameters.WorkArea.Height - 16 &&
+ ForegroundWindowInfo.WindowRect().Width >= SystemParameters.WorkArea.Width - 16)
+ {
+ if (!unfoldFloatingBarByUser && !isFloatingBarFolded) FoldFloatingBar_MouseUp(null, null);
+ }
+ }
+ }
+ // 处理其他需要检测批注窗口的情况
+ else if ((Settings.Automation.IsAutoFoldInEasiCamera && windowProcessName == "EasiCamera") ||
+ (Settings.Automation.IsAutoFoldInSeewoPincoTeacher && (windowProcessName == "BoardService" || windowProcessName == "seewoPincoTeacher")) ||
+ (Settings.Automation.IsAutoFoldInHiteCamera && windowProcessName == "HiteCamera") ||
+ (Settings.Automation.IsAutoFoldInHiteTouchPro && windowProcessName == "HiteTouchPro") ||
+ (Settings.Automation.IsAutoFoldInHiteLightBoard && windowProcessName == "HiteLightBoard"))
+ {
+ if (IsAnnotationWindow())
+ {
+ if (!isFloatingBarFolded) FoldFloatingBar_MouseUp(null, null);
+ }
+ else
+ {
+ if (!unfoldFloatingBarByUser && !isFloatingBarFolded) FoldFloatingBar_MouseUp(null, null);
+ }
+ }
+ // 处理其他普通情况
+ else
+ {
+ if (!unfoldFloatingBarByUser && !isFloatingBarFolded) FoldFloatingBar_MouseUp(null, null);
+ }
return;
}
- // 如果窗口概览模型未初始化,回退到传统的进程检测方式
- var windowProcessName = ForegroundWindowInfo.ProcessName();
- var windowTitle = ForegroundWindowInfo.WindowTitle();
//LogHelper.WriteLogToFile("windowTitle | " + windowTitle + " | windowProcessName | " + windowProcessName);
if (windowProcessName == "EasiNote")
@@ -742,224 +970,6 @@ namespace Ink_Canvas
catch { }
}
- ///
- /// 检查进程是否在用户的自动收纳设置中启用
- ///
- private bool IsProcessInAutoFoldSettings(string processName, WindowInfo windowInfo = null)
- {
- // 根据进程名和窗口信息检查是否在自动收纳设置中
- switch (processName)
- {
- case "EasiNote":
- // EasiNote需要检查版本
- if (windowInfo != null && !string.IsNullOrEmpty(windowInfo.ProcessPath) && windowInfo.ProcessPath != "Unknown")
- {
- try
- {
- var versionInfo = FileVersionInfo.GetVersionInfo(windowInfo.ProcessPath);
- string version = versionInfo.FileVersion;
- string prodName = versionInfo.ProductName;
-
- if (version != null && version.StartsWith("5.") && Settings.Automation.IsAutoFoldInEasiNote)
- return true;
- if (version != null && version.StartsWith("3.") && Settings.Automation.IsAutoFoldInEasiNote3)
- return true;
- if (prodName != null && prodName.Contains("3C") && Settings.Automation.IsAutoFoldInEasiNote3C)
- return true;
- }
- catch { }
- }
- return false;
-
- case "EasiCamera":
- return Settings.Automation.IsAutoFoldInEasiCamera;
-
- case "EasiNote5C":
- return Settings.Automation.IsAutoFoldInEasiNote5C;
-
- case "BoardService":
- case "seewoPincoTeacher":
- return Settings.Automation.IsAutoFoldInSeewoPincoTeacher;
-
- case "HiteCamera":
- return Settings.Automation.IsAutoFoldInHiteCamera;
-
- case "HiteTouchPro":
- return Settings.Automation.IsAutoFoldInHiteTouchPro;
-
- case "HiteLightBoard":
- return Settings.Automation.IsAutoFoldInHiteLightBoard;
-
- case "WxBoardMain":
- return Settings.Automation.IsAutoFoldInWxBoardMain;
-
- case "MicrosoftWhiteboard":
- case "msedgewebview2":
- return Settings.Automation.IsAutoFoldInMSWhiteboard;
-
- case "Amdox.WhiteBoard":
- return Settings.Automation.IsAutoFoldInAdmoxWhiteboard;
-
- case "Amdox.Booth":
- return Settings.Automation.IsAutoFoldInAdmoxBooth;
-
- case "QPoint":
- return Settings.Automation.IsAutoFoldInQPoint;
-
- case "YiYunVisualPresenter":
- return Settings.Automation.IsAutoFoldInYiYunVisualPresenter;
-
- case "WhiteBoard":
- // MaxHub需要检查窗口标题
- if (windowInfo != null && !string.IsNullOrEmpty(windowInfo.Title) &&
- windowInfo.Title.Contains("白板书写") && Settings.Automation.IsAutoFoldInMaxHubWhiteboard)
- {
- if (!string.IsNullOrEmpty(windowInfo.ProcessPath) && windowInfo.ProcessPath != "Unknown")
- {
- try
- {
- var versionInfo = FileVersionInfo.GetVersionInfo(windowInfo.ProcessPath);
- if (versionInfo.FileVersion != null && versionInfo.FileVersion.StartsWith("6.") &&
- versionInfo.ProductName == "WhiteBoard")
- return true;
- }
- catch { }
- }
- }
- return false;
-
- default:
- return false;
- }
- }
-
- ///
- /// 使用窗口概览模型检测是否需要自动收纳
- ///
- private void CheckAutoFoldWithWindowOverviewModel()
- {
- try
- {
- if (_windowOverviewModel == null) return;
-
- Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
- {
- try
- {
- var floatingBarMargin = ViewboxFloatingBar.Margin;
- var floatingBarWidth = ViewboxFloatingBar.ActualWidth;
- var floatingBarHeight = ViewboxFloatingBar.ActualHeight;
-
- // 如果浮动栏未显示或大小为0,跳过检测
- if (floatingBarWidth <= 0 || floatingBarHeight <= 0) return;
-
- // 计算浮动栏在屏幕上的位置(考虑DPI缩放)
- var screen = WinForms.Screen.PrimaryScreen;
- var dpiScaleX = PresentationSource.FromVisual(this)?.CompositionTarget?.TransformToDevice.M11 ?? 1.0;
- var dpiScaleY = PresentationSource.FromVisual(this)?.CompositionTarget?.TransformToDevice.M22 ?? 1.0;
-
- // 将WPF坐标转换为屏幕坐标
- var point = ViewboxFloatingBar.PointToScreen(new System.Windows.Point(0, 0));
- int left = (int)(point.X);
- int top = (int)(point.Y);
- int right = left + (int)(floatingBarWidth * dpiScaleX);
- int bottom = top + (int)(floatingBarHeight * dpiScaleY);
-
- // 创建检测区域(稍微扩大一点,确保检测到覆盖)
- var detectionArea = new WindowRect
- {
- Left = left - 5,
- Top = top - 5,
- Right = right + 5,
- Bottom = bottom + 5
- };
-
- // 排除当前应用程序的进程
- var excludeProcesses = new List { "InkCanvasForClass", "Ink Canvas" };
-
- // 检查 OldZyBoard(通过窗口标题检测)
- bool isOldZyBoardWindowExisted = Settings.Automation.IsAutoFoldInOldZyBoard &&
- (WinTabWindowsChecker.IsWindowExisted("WhiteBoard - DrawingWindow") ||
- WinTabWindowsChecker.IsWindowExisted("InstantAnnotationWindow"));
-
- if (isOldZyBoardWindowExisted)
- {
- if (!isFloatingBarFolded)
- {
- FoldFloatingBar_MouseUp(new object(), null);
- }
- }
- else if (!isOldZyBoardWindowExisted && isFloatingBarFolded && !foldFloatingBarByUser)
- {
- // OldZyBoard窗口退出时,如果未开启保持收纳模式,则展开
- if (!Settings.Automation.KeepFoldAfterSoftwareExit)
- {
- UnFoldFloatingBar_MouseUp(new object(), null);
- }
- return; // OldZyBoard 使用特殊检测方式,处理完后直接返回
- }
-
- if (isOldZyBoardWindowExisted)
- {
- return; // OldZyBoard 窗口存在时,直接返回,不继续检测其他窗口
- }
-
- // 获取覆盖浮动栏的所有窗口
- var coveringWindows = _windowOverviewModel.GetCoveringWindows(detectionArea, excludeProcesses, 0.1);
-
- // 检查是否有覆盖窗口在用户的自动收纳设置中
- bool shouldFold = false;
-
- foreach (var window in coveringWindows)
- {
- // 检查窗口是否全屏(全屏窗口优先)
- bool isFullScreen = window.IsFullScreen;
-
- // 检查窗口大小是否接近全屏(用于检测二级菜单等)
- bool isNearFullScreen = false;
- try
- {
- var screenBounds = WinForms.Screen.FromHandle(window.Handle).Bounds;
- isNearFullScreen = window.Rect.Width >= screenBounds.Width - 16 &&
- window.Rect.Height >= screenBounds.Height - 16;
- }
- catch { }
-
- // 如果窗口是全屏或接近全屏,且进程在自动收纳设置中,则应该收纳
- if ((isFullScreen || isNearFullScreen) && IsProcessInAutoFoldSettings(window.ProcessName, window))
- {
- shouldFold = true;
- break; // 找到匹配的窗口就退出
- }
- }
-
- // 如果检测到应该收纳的窗口,且当前未收纳,则收纳
- if (shouldFold && !isFloatingBarFolded)
- {
- FoldFloatingBar_MouseUp(new object(), null);
- }
- // 如果未检测到应该收纳的窗口,且当前已收纳(且不是用户手动收纳),则展开
- else if (!shouldFold && isFloatingBarFolded && !foldFloatingBarByUser)
- {
- // 检查是否启用了软件退出后保持收纳模式
- if (!Settings.Automation.KeepFoldAfterSoftwareExit)
- {
- UnFoldFloatingBar_MouseUp(new object(), null);
- }
- }
- }
- catch (Exception ex)
- {
- LogHelper.WriteLogToFile($"窗口概览模型检测失败: {ex.Message}", LogHelper.LogType.Error);
- }
- }));
- }
- catch (Exception ex)
- {
- LogHelper.WriteLogToFile($"窗口概览模型自动收纳检测异常: {ex.Message}", LogHelper.LogType.Error);
- }
- }
-
private void timerCheckAutoUpdateWithSilence_Elapsed(object sender, ElapsedEventArgs e)
{
// 停止计时器,避免重复触发
@@ -1200,4 +1210,4 @@ namespace Ink_Canvas
}
}
}
-}
+}
\ No newline at end of file