Исключение безопасности буфера обмена Silverlight 4 «доступ запрещен»? - PullRequest
5 голосов
/ 26 марта 2010

Я новичок в 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();
    }
}
}

Предполагается, что кнопка Event и таймер Event выполняют одно и то же действие. Но это не так! Кнопка отлично работает и устанавливает текст буфера обмена в метку, но таймер выдает исключение:

Доступ к буферу обмена запрещен

Вопрос: почему? :)

Спасибо.

PS: я бы поставил на проблему с нитью: p

Ответы [ 5 ]

4 голосов
/ 26 марта 2010

Доступ к буферу обмена в приложении Silverlight с частичным доверием (в браузере) (сценарий, на который вы, вероятно, ссылаетесь выше) ограничен. Свойство GetText доступно только в сценариях, которые, как определяет среда выполнения Silverlight, были инициированы пользователем. Ваш пример идеален - нажатием кнопки, например. Таймер диспетчеризации, однако, не инициируется пользователем, поэтому свойство выдает исключение (это особенно важно в контексте приложения в браузере, которое может стать большой дырой в безопасности, если вы можете создать приложение Silverlight, которое просто запускается в браузер, наблюдая за обновлениями буфера обмена пользователя без их ведома).

См. документацию буфера обмена для получения более подробной информации.

2 голосов
/ 22 июля 2010

Просто запустите Clipboard.ContainsText () вместо Text. Метод ContainsText разрешен!

1 голос
/ 26 марта 2010

Если ваш единственный вариант - использовать таймер, тогда вообще не делайте этого. Буфер обмена является общим ресурсом, и вы будете вызывать ошибки «не удается открыть буфер обмена» в других программах, когда они пытаются получить доступ к буферу обмена. пользователь что-то копирует из WinWord, WinWord пытается открыть буфер обмена, но не может, потому что вы заблокировали его во время проверки.

1 голос
/ 26 марта 2010

Вы пробовали это:

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

редактировать

После быстрого поиска кажется, что Clipboard доступен только в ответ на действие пользователя, см. здесь и здесь .

При частичном доверии (режим по умолчанию для размещенный в браузере на основе Silverlight приложения), Silverlight также ограничивает доступ к буферу обмена двумя ключевые API GetText и SetText. Эти API могут быть вызваны только из контекст, который определяется Время выполнения Silverlight будет в ответе к действию, инициированному пользователем. За Например, доступ к буферу обмена из обработчика клика или Событие KeyDown. В отличие от буфера обмена доступ недействителен из обработчика для Загружен или из конструктора, и попытки доступа генерируют исключения.

0 голосов
/ 11 марта 2013

Здравствуйте, у меня это работает, но только в IE Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() => HtmlPage.Window.Eval("window.clipboardData.setData('Text','testtestest')"));

просто используйте метод getData

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...