diff --git a/Ink Canvas/App.xaml b/Ink Canvas/App.xaml index aa4fc279..3d4723fd 100644 --- a/Ink Canvas/App.xaml +++ b/Ink Canvas/App.xaml @@ -1,4 +1,4 @@ - + + + + + + + + + + + + + + + + + + + + diff --git a/Ink Canvas/MainWindow.xaml.cs b/Ink Canvas/MainWindow.xaml.cs index 1a3d2729..97402f0e 100644 --- a/Ink Canvas/MainWindow.xaml.cs +++ b/Ink Canvas/MainWindow.xaml.cs @@ -82,6 +82,8 @@ namespace Ink_Canvas private static Cursor _cachedPenCursor = null; private static readonly object _cursorLock = new object(); + internal static DateTime? TrayTemporaryShowUntilUtc; + #region Window Initialization /// @@ -4398,12 +4400,19 @@ namespace Ink_Canvas /// /// 检查是否应该显示主窗口(基于PPT模式和PPT放映状态) /// - private void CheckMainWindowVisibility() + internal void CheckMainWindowVisibility() { try { if (Settings.ModeSettings.IsPPTOnlyMode) { + if (TrayTemporaryShowUntilUtc.HasValue && DateTime.UtcNow < TrayTemporaryShowUntilUtc.Value) + { + if (!IsVisible) + Show(); + return; + } + // 仅PPT模式:以 COM/UI 状态为主,Win32 检测全屏放映窗口(screenClass)作兜底,避免 COM 异常时无法唤出 bool comUiSlideShow = BtnPPTSlideShowEnd.Visibility == Visibility.Visible; bool win32SlideShow = IsPowerPointSlideshowSurfacePresentWin32(); diff --git a/Ink Canvas/MainWindow_cs/MW_TrayIcon.cs b/Ink Canvas/MainWindow_cs/MW_TrayIcon.cs index 1a537013..76a573c8 100644 --- a/Ink Canvas/MainWindow_cs/MW_TrayIcon.cs +++ b/Ink Canvas/MainWindow_cs/MW_TrayIcon.cs @@ -9,6 +9,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Forms; using System.Windows.Interop; +using System.Windows.Threading; using Application = System.Windows.Application; using ContextMenu = System.Windows.Controls.ContextMenu; using MenuItem = System.Windows.Controls.MenuItem; @@ -17,6 +18,11 @@ namespace Ink_Canvas { public partial class App : Application { + private const int TrayTemporaryShowMinutes = 2; + + private DispatcherTimer _trayTemporaryShowTimer; + + private bool _trayTemporaryShowRestoreHideChecked; /// /// 系统托盘菜单打开时的事件处理方法 @@ -131,6 +137,85 @@ namespace Ink_Canvas } } + private void TempShowMainWindowTrayIconMenuItem_Clicked(object sender, RoutedEventArgs e) + { + var mainWin = Current.MainWindow as MainWindow; + if (mainWin?.IsLoaded != true) + return; + + MenuItem hideItem = null; + try + { + var trayMenu = ((TaskbarIcon)Current.Resources["TaskbarTrayIcon"]).ContextMenu; + hideItem = trayMenu?.Items.OfType() + .FirstOrDefault(mi => mi.Name == "HideICCMainWindowTrayIconMenuItem"); + } + catch + { + } + + _trayTemporaryShowRestoreHideChecked = hideItem?.IsChecked == true; + + EnsureMainWindowReadyForSettings(mainWin); + + global::Ink_Canvas.MainWindow.TrayTemporaryShowUntilUtc = DateTime.UtcNow.AddMinutes(TrayTemporaryShowMinutes); + + _trayTemporaryShowTimer?.Stop(); + if (_trayTemporaryShowTimer == null) + { + _trayTemporaryShowTimer = new DispatcherTimer + { + Interval = TimeSpan.FromMinutes(TrayTemporaryShowMinutes) + }; + _trayTemporaryShowTimer.Tick += TrayTemporaryShowTimer_OnTick; + } + else + { + _trayTemporaryShowTimer.Interval = TimeSpan.FromMinutes(TrayTemporaryShowMinutes); + } + + _trayTemporaryShowTimer.Start(); + } + + private void TrayTemporaryShowTimer_OnTick(object sender, EventArgs e) + { + _trayTemporaryShowTimer?.Stop(); + global::Ink_Canvas.MainWindow.TrayTemporaryShowUntilUtc = null; + + var mainWin = Current.MainWindow as MainWindow; + if (mainWin?.IsLoaded != true) + { + _trayTemporaryShowRestoreHideChecked = false; + return; + } + + try + { + if (_trayTemporaryShowRestoreHideChecked) + { + var trayMenu = ((TaskbarIcon)Current.Resources["TaskbarTrayIcon"]).ContextMenu; + var hideItem = trayMenu?.Items.OfType() + .FirstOrDefault(mi => mi.Name == "HideICCMainWindowTrayIconMenuItem"); + if (hideItem != null) + hideItem.IsChecked = true; + else + mainWin.Hide(); + } + else + { + mainWin.CheckMainWindowVisibility(); + } + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"托盘临时显示计时结束处理失败: {ex.Message}", LogHelper.LogType.Warning); + } + finally + { + _trayTemporaryShowRestoreHideChecked = false; + } + } + private void OpenSettingsTrayIconMenuItem_Clicked(object sender, RoutedEventArgs e) { var mainWin = Current.MainWindow as MainWindow; @@ -326,6 +411,10 @@ namespace Ink_Canvas /// private void HideICCMainWindowTrayIconMenuItem_Checked(object sender, RoutedEventArgs e) { + _trayTemporaryShowTimer?.Stop(); + global::Ink_Canvas.MainWindow.TrayTemporaryShowUntilUtc = null; + _trayTemporaryShowRestoreHideChecked = false; + var mi = (MenuItem)sender; var mainWin = (MainWindow)Current.MainWindow; if (mainWin != null && mainWin.IsLoaded)