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:以上只是個人的看法,有不當之處,煩請指正。謝謝!)