2011-07-18 60 views
2

我讀過噸的其他問題與Google搜索這個問題,但我只能找出如何,如果我使用的WinForms做到這一點。我目前正在編寫一個庫,而庫的一個功能是處理日誌記錄。我正在實現的功能之一是在將問題寫入日誌之前自動截取頁面的屏幕截圖。與此相關的問題是我不知道哪個監視器需要截圖,因此如果用戶將瀏覽器移動到不同的監視器上,我仍然會拍攝一個主要的監視器。如何檢測運行ASP.NET程序的監視器?

public static Bitmap ScreenShot(string saveLocation, string fileName) 
{ 
    Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 
    Graphics.FromImage(bitmap).CopyFromScreen(0, 0, 0, 0, bitmap.Size); 
    string savePath = Path.Combine(Path.GetDirectoryName(saveLocation), "ScreenShots"); 
    if (!Directory.Exists(savePath)) 
     Directory.CreateDirectory(savePath); 
    bitmap.Save(Path.Combine(savePath, fileName), ImageFormat.Png); 
    return bitmap; 
} 

我試過Screen.FromControl(),但因爲它不是一個WinForms應用程序,我沒有任何System.Windows.Forms.Controls爲它找到。

確實ASP.NET有什麼相同呢?或者我可以明確地投射到一個winform控件?

+2

你的截圖()方法運行服務器端 - 它怎麼可能把客戶端的截圖? – n8wrl

+1

只有當瀏覽器與ASP服務器在同一臺計算機上運行時,這纔有用嗎? – antlersoft

+0

搶奪你有的代碼並轉換爲JavaScript :)。 – JonH

回答

4

當然你在這裏運行任何代碼將在服務器上運行,從而將不知道從哪裏它顯示

從理論上講,你可以使用JS捕捉DOM,然後通過發送回服務一個Ajax調用 - 這就是你會得到我認爲

+0

如果我發現這不起作用(我想它實際上不會),那麼DOM就是我要嘗試的下一件事。感謝你的回答! – Sivvy

7

這是行不通的最接近的一次。您的c#代碼正在Web服務器上運行,而不是在用戶的Web瀏覽器上運行,而不是在其計算機上運行。代碼可以訪問的唯一監視器是連接到Web服務器的監視器。

這可能出現對您的開發平臺工作,但只是因爲你的Web服務器和客戶端計算機是相同機。

,你可以期望的最好是包括可以捕獲,甚至可能無法工作頁面上的Flash或Silverlight對象。

+0

是的,我並不完全確定它會起作用,但我希望因爲所有容易找到的教程都在談論關於ASPX頁面的屏幕截圖,所以它可能會以某種方式成爲可能。 – Sivvy

+0

在Silverlight和Flash中,您都可以捕獲屏幕。但是,它只會捕獲瀏覽器的Silverlight/Flash客戶端區域。換句話說,只有運行Silverlight組件的瀏覽器部分纔會被捕獲 – Icemanind

0

我能想到的唯一的一種可能是一些客戶端,要求該瀏覽器採取截圖,然後上傳。 FogBugz用它的新案例工具做了這樣的事情,但這是一個用戶必須下載和安裝的加載項。

3

你試圖把客戶端的屏幕截圖從ASP.NET應用程序?這是不可能的。您可以記錄包括HTML在內的整個請求,然後將其重新渲染到其他位置,但您無法從服務器端應用程序框架與客戶端進行那種交互。

2

如果用戶移動瀏覽器不同的顯示器,我還是採取了一槍主之一

ASP.NET的在服務器上運行,所以寫服務器代碼屏幕捕捉圖像的瀏覽器無意義的。使用客戶端代碼(javascript)拍攝屏幕截圖可能會有更好的運氣。

這個線程使用ActiveX解決方案: Take a screenshot of a webpage with JavaScript?

2

ASP.Net Web窗體不工作,你可能會想他們這樣做。簡短的答案是否定的,你不能在ASP.Net中做到這一點。沒有相應的東西。

WinForms通過與Windows操作系統交互顯示,並顯示在同一臺計算機的桌面上。通過生成HTML並將HTML發送到另一臺計算機的瀏覽器來顯示WebForms。你的ASP。網絡代碼未在其他計算機的瀏覽器上運行。如果您的代碼嘗試拍攝屏幕截圖,那麼最好是,您將獲得服務器(或計算機)的顯示。

您可以使用JavaScript的瀏覽器中運行的代碼 - 但你還是不應該服用屏幕截圖(我不認爲JavaScript的會讓你 - 至少不是自動)。首先,你會在他們的屏幕上包含其他可能不相關的信息。

當ASP.Net遇到問題,它會在IIS日誌文件記錄在服務器上的Windows登錄細節,也(較少細節)。考慮遇到錯誤時通過電子郵件發送警報,並在日誌中查看發生了什麼問題。

1

我會偷目前使用的谷歌+的算法。我絕對沒有確切的算法,甚至是一個接近實際的事情,但我覺得這是它在做什麼:在「日誌/報告錯誤」

  • 用戶點擊
  • 服務器呈現當前頁面使用滾動條的位置和窗口的大小(通過JS訪問)。
  • 服務器呈現覆蓋整個窗口的div並將圖像放置在其中。這個div具有最高的Z指數。
  • 當用戶點擊div時,會生成一個新的div,允許用戶「突出顯示」所選區域。然後允許用戶將註釋附加到該選定區域。

它在執行天才。

0

我這樣做是爲了一個bug跟蹤應用程序在很久以前使用被寫入--gasp-- Visual Basic中的ActiveX控件。類似的東西(除了提到的酷伎倆技巧之外)是關於你唯一的選擇。

相關問題