2010-01-27 18 views
1

我正在使用C#.NET截取第二臺顯示器的內容並將其顯示在主屏幕上的一個窗口中。截屏不凍屏。 C#和WindowsXP

我的代碼是:

screenShotGraphics.CopyFromScreen(
    Screen.AllScreens[screen].Bounds.X, 
    Screen.AllScreens[screen].Bounds.Y, 
    0, 
    0, 
    Screen.AllScreens[screen].Bounds.Size, 
    CopyPixelOperation.SourceCopy); 

這工作得很好,當它被點擊一個按鈕觸發,因爲輕微的延遲並不明顯,但是當它是自動運行(比如每隔幾秒鐘)用戶可以很容易地注意到他們的鼠標「鎖定」了幾秒鐘。

顯然這並不理想。那麼是否有更快的方法來執行此操作? (或者在不中斷鼠標移動或交互的情況下執行此操作的方式?)

+0

在拍攝屏幕的同時你還做了其他事情嗎?例如,如果調整圖像大小然後複製圖像,則可以將任務分開並在中間執行延遲。那麼延遲可能不那麼明顯。 – 2010-01-27 13:03:27

+0

底層Windows API調用(BitBlt)在複製位圖時臨時隱藏鼠標。你無法解決這個問題。 – 2010-01-27 13:26:04

回答

2

您可以嘗試使用BackgroundWorker控件執行屏幕快照,這是在單獨的線程上運行該功能的簡單方法。 BackgroundWorker的的DoWork的事件中,每當你想運行你的函數只要致電:

yourBackgroundWorker.RunWorkerAsync()

編輯: 它可能這樣做,所以,只要在屏幕上移動(如鼠)不會模糊屏幕截圖,你可以嘗試打破屏幕ñ下拉到更小的部分,並採取截圖,然後將它們縫合在一起。由於您在單獨的線程中,這將釋放鼠標在每個部分屏幕截圖之間的移動,但它存在屏幕上發生更改的風險(取決於實際需要多長時間)

+0

我已經在單獨的線程中運行截圖了。但這並沒有幫助 - 即使在單獨的線程中,以這種方式進行屏幕截圖的操作似乎也會因爲光標暫時凍結而丟失。 – 2010-01-27 12:40:30

+0

經過對您的回答稍作修改後,我發現它很好地解決了這個問題。乾杯! – 2010-02-05 14:22:54

+0

只是出於好奇,你分成多少部分,截圖需要多長時間才能完成? – 2010-02-09 15:47:38

1

嘗試撥打電話主線程,如果你需要保存圖像文件,在另一個線程...

我認爲沒有其他的辦法,因爲CopyFromScreen,調用BitBlt api函數,女巫是一個如果您想通過api調用來執行此操作,則必須調用...所以這是Windows提供的唯一功能。