none
如何避免OpenClipboard 失败?(C++) RRS feed

  • 问题

  • 代码:(外侧包有 try{}catch(int c){c++;})

    Windows::ApplicationModel::DataTransfer::Clipboard^ a; auto b = a->GetContent();

    //后面有关于截取图像的代码

    当时我正在不停地进行printscreen(无论是用手按还是编程按),结果突然触发错误。



    2014年7月26日 2:43

答案

  • 你好 lxylxy123456,

    你的这段代码是在非UI进程上运行的么?

    有个类似的帖子:http://social.msdn.microsoft.com/Forums/windowsapps/en-US/7892f595-4584-41d4-8265-94a6d67bc039/open-clipboard-failed

    我这里也做了一下测试,通过button点击来获取剪贴板内容是可以正常运行的。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.


    2014年7月28日 7:04
    版主
  • 果然没调试定义的地方还是有点问题啊,用这段吧:

    	Windows::UI::Core::CoreWindow^ wnd = Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow;
    	//assert(wnd != nullptr);
    
    
    	wnd->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal,
    		ref new Windows::UI::Core::DispatchedHandler([this]()
    	{
    		Windows::ApplicationModel::DataTransfer::Clipboard^ a;
    		auto b = a->GetContent();   // 你后续的代码
    
    	}));

    这段话的作用就是把你的代码在UI线程中执行,应该就不会出现ClipBoard失败的情况啦,不过你代码里面也需要进行判断是否可以获取图片,如果你剪贴板的内容是文本,但你还是要获取图片,必然报错的。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月31日 6:16
    版主
  • 可能是你猜测的一样,这个帖子是WPF的,不过也是同样的OpenClipboard失败错误: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/e6867eee-b73b-47d3-bf6c-b97a0ab136ac/clipboard-opening-failed-c-wpf?forum=wpf

    你可以在失败的时候告诉用户再试一次或者直接忽略这个错误,不好意思,我想我也没有其他办法了,毕竟Windows Store App不是运行在系统层面,不能检测Clipboard的状态,如果Clipboard被其他程序占用了,可能访问不了的。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月31日 7:07
    版主

全部回复

  • 你好 lxylxy123456,

    你的这段代码是在非UI进程上运行的么?

    有个类似的帖子:http://social.msdn.microsoft.com/Forums/windowsapps/en-US/7892f595-4584-41d4-8265-94a6d67bc039/open-clipboard-failed

    我这里也做了一下测试,通过button点击来获取剪贴板内容是可以正常运行的。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.


    2014年7月28日 7:04
    版主
  • 我是想定期获取剪贴板并处理(例如1秒1次),似乎错去的原因是printscreen和我的程序都在用剪贴板,应该属于后台处理。你认为能否防止事件发生?(我可能没说清,错误是有时触发,大多情况没有问题)
    2014年7月28日 9:51
  • 这个你还是需要dispatcher来返回UI线程执行。

      _dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, 
                            ref new Windows::UI::Core::DispatchedHandler([=]()
      {
        // 把你的方法放在这里。
    
      }, CallbackContext::Any)); 

    --James

    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月29日 2:57
    版主
  • 我的获取剪贴板程序是使用timer进行的,能不能说的详细一点?(关于如何更改代码和你的代码中_dispatcher的定义)

    2014年7月29日 3:27
  • 你好,我参考的链接是这个:RunAsync 方法

    它可以从辅助线程上通过调用这个方法从来让代码在UI线程上执行。下面代码你调试一下,我是直接写在浏览器里面,有可能定义的地方没写对。

    using namespace Windows::UI::Core;

    auto _dispatcher = new Windows::UI::Core::CoreDispatcher();

    _dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal, ref new Windows::UI::Core::DispatchedHandler([this]() { Windows::ApplicationModel::DataTransfer::Clipboard^ a;
    auto b = a->GetContent(); // 你后续的代码

    }));

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.


    2014年7月31日 2:28
    版主

  • 我还没有试,但是这样写一定可以避免OpenClipBoard的错误吗?

    试了,编译错误。

    我已经进行using namespace Windows::UI::Core;

    错误:

    错误	2	error C2248: “Windows::UI::Core::CoreDispatcher::CoreDispatcher”: 无法访问 private 成员(在“Windows::UI::Core::CoreDispatcher”类中声明) (Page4.xaml.cpp)

    2014年7月31日 4:29
  • 果然没调试定义的地方还是有点问题啊,用这段吧:

    	Windows::UI::Core::CoreWindow^ wnd = Windows::ApplicationModel::Core::CoreApplication::MainView->CoreWindow;
    	//assert(wnd != nullptr);
    
    
    	wnd->Dispatcher->RunAsync(Windows::UI::Core::CoreDispatcherPriority::Normal,
    		ref new Windows::UI::Core::DispatchedHandler([this]()
    	{
    		Windows::ApplicationModel::DataTransfer::Clipboard^ a;
    		auto b = a->GetContent();   // 你后续的代码
    
    	}));

    这段话的作用就是把你的代码在UI线程中执行,应该就不会出现ClipBoard失败的情况啦,不过你代码里面也需要进行判断是否可以获取图片,如果你剪贴板的内容是文本,但你还是要获取图片,必然报错的。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月31日 6:16
    版主
  • 还是出错了,和原来的错误一样。(OpenClipboard 失败)
    可能是这个程序和printscreen程序同时使用了剪贴板导致的。
    如果你认为没有办法了,请通知我,我会标记答案。
    2014年7月31日 7:01
  • 可能是你猜测的一样,这个帖子是WPF的,不过也是同样的OpenClipboard失败错误: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/e6867eee-b73b-47d3-bf6c-b97a0ab136ac/clipboard-opening-failed-c-wpf?forum=wpf

    你可以在失败的时候告诉用户再试一次或者直接忽略这个错误,不好意思,我想我也没有其他办法了,毕竟Windows Store App不是运行在系统层面,不能检测Clipboard的状态,如果Clipboard被其他程序占用了,可能访问不了的。

    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月31日 7:07
    版主
  • 可惜的是如果在运行时出错,会自动退出程序。不能像你说的那样让用户重试,只能由用户重新打开应用。
    2014年7月31日 7:18
  • 使用 try catch 也不行?

    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    2014年7月31日 7:19
    版主
  • 不行。try catch是万能的吗?
    2014年7月31日 9:24