Silverlight 4剪贴板安全例外“不允许访问”?

时间:2010-03-26 18:32:34

标签: c# silverlight security exception clipboard

我是Silverlight的新手,我正在做一些测试。在我目前的测试中,我尝试实时显示当前的剪贴板内容。但是这段代码有一些奇怪的行为:

namespace SilverlightTest
{
public partial class MainPage : UserControl
{
    private Timer _timer;

    public MainPage()
    {
        InitializeComponent();
        var dispatcher_timer = new DispatcherTimer {Interval = new TimeSpan(0, 0, 0, 5)};
        dispatcher_timer.Tick += new EventHandler(timer_Callback);
        dispatcher_timer.Start();
    }

    private void timer_Callback(object state, EventArgs eventArgs)
    {
        current_clip_board.Content = Clipboard.GetText();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        current_clip_board.Content = Clipboard.GetText();
    }
}
}

按钮事件和计时器事件假设执行完全相同的操作。 但事实并非如此! Button工作正常并将剪贴板文本设置为标签,但计时器抛出异常:

  

不允许剪贴板访问

问题是:为什么? :)

感谢。

PS:我打赌线程问题:p

5 个答案:

答案 0 :(得分:4)

剪贴板访问,在部分信任(浏览器中)Silverlight应用程序(您可能在上面提到的场景)中受到限制。只有在Silverlight运行时确定由用户启动的方案中才能访问GetText属性。您的示例很完美 - 例如按一下按钮。然而,调度计时器不是用户启动的,因此该属性会抛出异常(这在浏览器内应用程序的上下文中尤其重要,如果您可以创建一个只在其中静默运行的Silverlight应用程序,这可能是一个很大的安全漏洞。浏览器,在他们不知情的情况下观看用户的剪贴板更新。

有关详细信息,请参阅此clipboard documentation

答案 1 :(得分:2)

只需触发Clipboard.ContainsText()而不是Text。允许使用ContainsText方法!

答案 2 :(得分:1)

你试过这个:

private void timer_Callback(object state, EventArgs eventArgs) 
{
    Dispatcher.Invoke(new System.Threading.ThreadStart(delegate()
    {
        current_clip_board.Content = Clipboard.GetText(); 
    }
} 

修改

快速搜索后,Clipboard似乎只有在响应用户操作时才会显示herehere

  

部分信任(默认模式为   浏览器托管的基于Silverlight的   应用程序),Silverlight也   限制剪贴板访问它们的两个   关键API GetText和SetText。这些   API只能在a中调用   上下文由...决定   Silverlight运行时要响应   用户发起的动作。对于   例如,剪贴板访问有效   来自Click或者的处理程序   KeyDown事件。相比之下,剪贴板   访问权限从处理程序无效   加载或来自构造函数,和   访问尝试抛出异常。

答案 3 :(得分:1)

如果您唯一的选择是使用计时器,那么根本不要这样做。 clipboad是一个共享资源,当他们尝试访问剪贴板时,您将在其他程序中引发“无法打开剪贴板”错误。即用户从WinWord复制内容,WinWord尝试打开剪贴板,但不能,因为你在检查它时已将其锁定。

答案 4 :(得分:0)

你好,这对我有用,但只适用于IE Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() => HtmlPage.Window.Eval("window.clipboardData.setData('Text','testtestest')"));

只需使用getData方法