1. 程式人生 > >WPF複製異常問題(OpenClipboard 失敗 (異常來自 HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)))

WPF複製異常問題(OpenClipboard 失敗 (異常來自 HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)))

       最近在維護WPF系統的時候發現的問題,剛剛開始自己的電腦都不能重現,後面寫日誌跟蹤才發現問題的所在。問題主要是由於:1.在程式訪問剪下板的時候,有其他程式正在佔用剪下板,導致自己的程式無法訪問,從而丟擲異常;2.沒有訪問的許可權,導致自己的程式無法訪問。這個是之前在App.xaml.cs檔案中的寫法:

        #region
        ///// <summary>
        ///// 處理異常的方法
        ///// </summary>
        ///// <param name="sender"></param>
        ///// <param name="e"></param>
        private void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            //在wpf中如果複製沒有許可權此時也會進來這裡(PS:以管理員和相容性執行此程式即可哦)
            if (e.Exception.InnerException.Message.Contains("網路") || e.Exception.InnerException.Message.Contains("超時") || e.Exception.InnerException.Message.Contains("暫停"))
            {
                BugReport report = new BugReport(e.Exception);
                report.Save();
                e.Handled = true;
                report.LaunchBugReport();
                MessageBox.Show(e.Exception.InnerException.Message);
            }
            else
            {
                BugReport report = new BugReport(e.Exception);
                report.Save();
                report.LaunchBugReport();
                e.Handled = true;
                Application.Current.Shutdown();
            }
        }

這個是修改之後的寫法:

 在App.xaml檔案中新增下面程式碼中紅色的部分
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  StartupUri="MainWindow.xaml"
  DispatcherUnhandledException="Application_DispatcherUnhandledException">

在App.xaml.cs檔案中新增程式碼:

     private void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            var comException = e.Exception as System.Runtime.InteropServices.COMException;
            if (comException != null && comException.ErrorCode == -2147221040)
                e.Handled = true;
            BugReport report = new BugReport(e.Exception);
            report.Save();
            e.Handled = true;
        }

這種方法中剪下板動作會自動多次嘗試,由於丟擲的異常被App中的異常處理給截獲了,所以會不斷的嘗試直到成功。(PS:以上只是個人的看法,有不當之處,煩請指正。謝謝!)