2010-03-26 64 views
5

我是Silverlight新手,我正在做一些測試。通過我目前的測試,我嘗試實時顯示當前的剪貼板內容。但是這個代碼有一個奇怪的行爲:Silverlight 4剪貼板安全異常「訪問不被允許」?

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(); 
    } 
} 
} 

按鈕事件和計時器事件是假設做完全相同的行爲。 但它不!該按鈕正常工作和剪貼板文本設置成標籤,但計時器拋出異常:

剪貼板不允許訪問

的問題是:爲什麼? :)

謝謝。

PS:我會賭一個線程的問題:對

回答

4

在部分信任(瀏覽器內)Silverlight應用程序(上面可能提​​到的場景)中,剪貼板訪問受到限制。 GetText屬性只能在Silverlight運行時確定由用戶啓動的情況下訪問。你的例子是完美的 - 例如通過點擊按鈕。然而,派發計時器不是用戶啓動的,因此該屬性會拋出一個異常(這在瀏覽器內應用程序的上下文中尤爲重要,如果您可以創建一個僅在第三方應用程序中靜默運行的Silverlight應用程序,這可能是一個巨大的安全漏洞。瀏覽器,在不知情的情況下觀看用戶的剪貼板更新)。

有關更多詳細信息,請參閱此clipboard documentation

+0

謝謝。有沒有辦法繞過這個限制?我不想要黑客,但是,這可能是我想要構建的應用程序不可缺少的功能... – 2010-03-26 20:26:11

+0

@Niklaos:解決此限制的唯一方法是將應用程序安裝爲瀏覽器應用程序相信。 – AnthonyWJones 2010-03-26 21:40:14

+1

另請注意,Silverlight剪貼板僅限於文本。 – WiredPrairie 2010-03-27 15:01:21

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只能在由 Silverlight運行時確定的 上下文中調用,以響應用戶發起的操作的 。例如,對於 示例,剪貼板訪問從Click或 KeyDown事件的處理程序內有效 。相比之下,剪貼板 訪問對於加載或來自構造函數的 處理程序無效,並且 訪問嘗試會引發異常。

+1

Dispatcher.Invoke產生編譯錯誤。 BeginInvoke編譯,但同一行生成相同的異常:/任何其他想法? – 2010-03-26 19:06:16

1

如果您唯一的選擇是使用計時器,那麼請不要這樣做。 clipboad是一個共享資源,當您嘗試訪問剪貼板時,您將在其他程序中引發「無法打開剪貼板」錯誤。即用戶從WinWord中複製某些內容,WinWord會嘗試打開剪貼板,但不能,因爲您在檢查時已將其鎖定。

+0

很高興知道!我不想使用計時器(這很難看),但還有其他一些方法嗎?這似乎是微軟忘了「ClipboardUpdated」事件:p – 2010-03-26 20:46:01

+0

不知道,因爲我不知道Silverlight。在這類事情的另一端,我有很多經驗。在API文檔中查找對Clipboard Viewer或WM_DrawClipboard的任何類型的引用。另外,要明白你的GetText()調用會導致WM_RenderFormat消息被髮送到複製的應用程序(如果他們使用大多數應用程序所做的「延遲渲染」),那麼你將以這種方式添加到你的麻煩中同樣,通過非常保證無論你試圖抓取什麼,都會導致提供應用程序想要再次打開剪貼板。並失敗。 – 2010-03-26 20:58:51

+1

Microsoft確實向本機Win32應用程序提供了剪貼板更新的消息(WM_CLIPBOARDUPDATE)。 但是,對於跨平臺的Silverlight應用程序,您無法訪問此消息/功能(特別是在瀏覽器內應用程序的情況下,如果您可以編寫剛剛坐的代碼,這會是一個很大的安全問題在瀏覽器中默默無聞地看着用戶的剪貼板更新)。 – WiredPrairie 2010-03-27 15:12:16

2

只需觸發Clipboard.ContainsText()而不是Text。 ContainsText方法是允許的!

0

你好這對我的作品,但只有在IE Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(() => HtmlPage.Window.Eval("window.clipboardData.setData('Text','testtestest')"));

只使用GetData方法