C# Silverlight 4剪贴板安全例外;不允许访问“;?
我是Silverlight的新手,正在做一些测试。在当前测试中,我尝试实时显示当前剪贴板内容。但这段代码有一个奇怪的行为:C# Silverlight 4剪贴板安全例外;不允许访问“;?,c#,silverlight,security,exception,clipboard,C#,Silverlight,Security,Exception,Clipboard,我是Silverlight的新手,正在做一些测试。在当前测试中,我尝试实时显示当前剪贴板内容。但这段代码有一个奇怪的行为: namespace SilverlightTest { public partial class MainPage : UserControl { private Timer _timer; public MainPage() { InitializeComponent(); var dispatcher_timer
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事件和timer事件执行完全相同的操作。
但事实并非如此!该按钮工作正常,并将剪贴板文本设置到标签中,但计时器引发异常:
不允许访问剪贴板
问题是:为什么?:)
谢谢
PS:我敢打赌一个线程问题:p你试过这个吗:
private void timer_Callback(object state, EventArgs eventArgs)
{
Dispatcher.Invoke(new System.Threading.ThreadStart(delegate()
{
current_clip_board.Content = Clipboard.GetText();
}
}
编辑
快速搜索后,剪贴板
似乎仅在响应用户操作时可用,请参见和
处于部分信任状态(默认模式为
基于浏览器的Silverlight
应用),也包括Silverlight
将剪贴板访问权限限制为两个
关键API GetText和SetText。这些
只能从内部调用API
由上下文确定的上下文
Silverlight运行时将作为响应
用户启动的操作。对于
例如,剪贴板访问是有效的
从处理程序中单击或
按键关闭事件。相比之下,剪贴板
从的处理程序访问无效
从构造函数加载或从构造函数加载,以及
访问尝试引发异常
在部分信任(浏览器中)Silverlight应用程序(您可能在上面提到的场景)中,剪贴板访问受到限制。只有在Silverlight运行时确定由用户启动的场景中,才能访问GetText属性。您的示例非常完美--例如,通过单击按钮。但是,分派计时器不是由用户启动的,因此属性会引发异常(这在浏览器内应用程序的上下文中尤其重要,如果您可以创建一个Silverlight应用程序,该应用程序只是在浏览器中静默运行,在用户不知情的情况下监视用户的剪贴板更新,那么这可能是一个很大的安全漏洞)
有关更多详细信息,请参阅此部分。如果您唯一的选择是使用计时器,则完全不要这样做。剪贴板是一个共享资源,当其他程序试图访问剪贴板时,您将在其中引发“无法打开剪贴板”错误。i、 e.用户从WinWord复制内容,WinWord尝试打开剪贴板,但无法打开,因为您在检查它时锁定了它。只需触发剪贴板。ContainsText()而不是文本。方法ContainsText是允许的 您好,这对我很有效,但仅适用于IE
Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(()=>HtmlPage.Window.Eval(“Window.clipboardData.setData('Text','TestTestTestest')))代码>
只需使用getData方法Dispatcher.Invoke即可生成编译错误。BeginInvoke编译,但同一行生成了相同的异常:/还有其他想法吗?谢谢。有没有办法绕过这个限制?我不想被黑客攻击,但是,这可能是我想要构建的应用程序不可或缺的功能…@Niklaos:绕过此限制的唯一方法是将应用程序安装为具有提升信任度的浏览器外应用程序。还要注意,Silverlight剪贴板仅限于文本。很高兴知道!我不想使用计时器(它很难看),但还有其他方法吗?微软似乎忘记了“剪贴簿更新”活动:pNo创意,因为我不知道Silverlight。我只是在这类事情的另一端有很多经验。在API文档中查找对剪贴板查看器或WM_DrawClipboard的任何类型的引用。另外,要了解GetText()调用将导致WM_RenderFormat消息发送到进行复制的应用程序(如果它们使用大多数大型应用程序所使用的“延迟渲染”),因此,您也将以这种方式增加麻烦,因为您几乎可以保证,无论您刚刚尝试获取什么,将导致提供应用程序希望再次打开剪贴板。Microsoft确实向本机Win32应用程序(WM_CLIPBOARDUPDATE)提供了剪贴板更新消息。但是,对于跨平台Silverlight应用程序,您无法访问此消息/功能(特别是在浏览器内应用程序的上下文中,如果您可以编写代码,静静地坐在浏览器中,在用户不知情的情况下查看用户的剪贴板更新,这将是一个很大的安全问题)。