From b658bf4fd021886f3815958cb7a2db4a4fb52898 Mon Sep 17 00:00:00 2001 From: CJKmkp <2564608840@qq.com> Date: Fri, 13 Feb 2026 13:20:50 +0800 Subject: [PATCH] =?UTF-8?q?improve:=E5=9B=BE=E7=89=87=E6=8F=92=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MainWindow_cs/MW_ClipboardHandler.cs | 68 +++++++++++++------ .../MainWindow_cs/MW_FloatingBarIcons.cs | 4 ++ Ink Canvas/MainWindow_cs/MW_Notification.cs | 11 ++- 3 files changed, 59 insertions(+), 24 deletions(-) diff --git a/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs b/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs index 1dc7e81c..80999649 100644 --- a/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs +++ b/Ink Canvas/MainWindow_cs/MW_ClipboardHandler.cs @@ -34,6 +34,8 @@ namespace Ink_Canvas private bool isClipboardMonitoringEnabled; private BitmapSource lastClipboardImage; private HwndSource _clipboardHwndSource; + private DateTime _lastPasteNotificationTime = DateTime.MinValue; + private const int PasteNotificationDebounceSeconds = 4; // 初始化剪贴板监控 private void InitializeClipboardMonitoring() @@ -50,6 +52,7 @@ namespace Ink_Canvas OnSourceInitializedForClipboard(this, EventArgs.Empty); else SourceInitialized += OnSourceInitializedForClipboard; + Dispatcher.BeginInvoke(new Action(EnsureClipboardHookInstalled), DispatcherPriority.Loaded); } catch (Exception ex) { @@ -57,6 +60,14 @@ namespace Ink_Canvas } } + private void EnsureClipboardHookInstalled() + { + if (_clipboardHwndSource != null) return; + var handle = new WindowInteropHelper(this).Handle; + if (handle == IntPtr.Zero) return; + OnSourceInitializedForClipboard(this, EventArgs.Empty); + } + private void OnSourceInitializedForClipboard(object sender, EventArgs e) { SourceInitialized -= OnSourceInitializedForClipboard; @@ -92,19 +103,12 @@ namespace Ink_Canvas { try { - if (Clipboard.ContainsImage()) - { - var clipboardImage = Clipboard.GetImage(); - if (clipboardImage != null && clipboardImage != lastClipboardImage) - { - lastClipboardImage = clipboardImage; - // 在白板模式下显示粘贴提示 - if (currentMode == 1) // 白板模式 - { - ShowPasteNotification(); - } - } - } + if (!Clipboard.ContainsImage()) + return; + + var clipboardImage = Clipboard.GetImage(); + if (clipboardImage != null) + lastClipboardImage = clipboardImage; } catch (Exception ex) { @@ -112,22 +116,42 @@ namespace Ink_Canvas } } - // 显示粘贴提示 - private void ShowPasteNotification() + public void CheckClipboardImageAndShowPasteNotificationWhenEnteringBoard() { try { - Dispatcher.Invoke(() => - { - ShowNotification("检测到剪贴板中有图片,右键点击白板可粘贴"); - }); + if (!Clipboard.ContainsImage()) + return; + + bool debounceElapsed = (DateTime.Now - _lastPasteNotificationTime).TotalSeconds >= PasteNotificationDebounceSeconds; + if (!debounceElapsed) + return; + + _lastPasteNotificationTime = DateTime.Now; + ShowPasteNotification(); } catch (Exception ex) { - LogHelper.WriteLogToFile($"显示粘贴提示失败: {ex.Message}", LogHelper.LogType.Error); + LogHelper.WriteLogToFile($"进入白板时检测剪贴板失败: {ex.Message}", LogHelper.LogType.Error); } } + // 显示粘贴提示 + private void ShowPasteNotification() + { + Dispatcher.BeginInvoke(new Action(() => + { + try + { + ShowNotification("检测到剪贴板中有图片,右键点击白板可粘贴"); + } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"显示粘贴提示失败: {ex.Message}", LogHelper.LogType.Error); + } + }), DispatcherPriority.Normal); + } + // 处理右键菜单显示 private void ShowPasteContextMenu(Point position) { @@ -360,9 +384,9 @@ namespace Ink_Canvas ClipboardUpdate?.Invoke(); } } - catch + catch (Exception ex) { - // 忽略剪贴板访问错误 + LogHelper.WriteLogToFile($"剪贴板 NotifyFromMessage 异常: {ex.Message}", LogHelper.LogType.Error); } } diff --git a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs index 8a852999..5a8e0b01 100644 --- a/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs +++ b/Ink Canvas/MainWindow_cs/MW_FloatingBarIcons.cs @@ -3027,6 +3027,8 @@ namespace Ink_Canvas } StackPanelPPTButtons.Visibility = Visibility.Visible; + + CheckClipboardImageAndShowPasteNotificationWhenEnteringBoard(); } Topmost = true; @@ -3186,6 +3188,8 @@ namespace Ink_Canvas { Topmost = false; } + + CheckClipboardImageAndShowPasteNotificationWhenEnteringBoard(); break; } } diff --git a/Ink Canvas/MainWindow_cs/MW_Notification.cs b/Ink Canvas/MainWindow_cs/MW_Notification.cs index e1e69945..d2d3b2fe 100644 --- a/Ink Canvas/MainWindow_cs/MW_Notification.cs +++ b/Ink Canvas/MainWindow_cs/MW_Notification.cs @@ -1,4 +1,4 @@ -using Ink_Canvas.Helpers; +using Ink_Canvas.Helpers; using System; using System.Linq; using System.Threading; @@ -21,6 +21,10 @@ namespace Ink_Canvas { try { + if (TextBlockNotice == null || GridNotifications == null) + { + return; + } lastNotificationShowTime = Environment.TickCount; TextBlockNotice.Text = notice; @@ -36,7 +40,10 @@ namespace Ink_Canvas }); }).Start(); } - catch { } + catch (Exception ex) + { + LogHelper.WriteLogToFile($"ShowNotification 异常: {ex.Message}", LogHelper.LogType.Error); + } } } } \ No newline at end of file