您的位置:首页 > 运维架构

WPF复制异常问题(OpenClipboard 失败 (异常来自 HRESULT:0x800401D0 (CLIPBRD_E_CANT_OPEN)))

2017-01-02 18:41 218 查看
       最近在维护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:以上只是个人的看法,有不当之处,烦请指正。谢谢!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  wpf
相关文章推荐