C# 在c语言中使用屏幕捕获方法获取黑屏快照#

C# 在c语言中使用屏幕捕获方法获取黑屏快照#,c#,asp.net,screen-capture,C#,Asp.net,Screen Capture,我在c#Hand-on中使用屏幕捕获方法。在本地项目中,一切正常。但当我将我的应用程序发布到live domain时,我会被截屏 我使用以下两种方法来捕获活动窗口屏幕 1) (二) 上述方法在当地项目中效果良好。但发布后屏幕截图保存到驱动器中,但得到黑色(空) 您的回答将不胜感激。这些项目将用于桌面环境,而不是网页(第一个链接上的项目完全错误!) 您将获得一个黑屏,因为您捕获了应用程序运行的屏幕,因此您将获得服务器的屏幕,如果没有用户登录,屏幕将是黑色的 您不能使用此代码捕获远程web客户端屏

我在c#Hand-on中使用屏幕捕获方法。在本地项目中,一切正常。但当我将我的应用程序发布到live domain时,我会被截屏

我使用以下两种方法来捕获活动窗口屏幕 1) (二)

上述方法在当地项目中效果良好。但发布后屏幕截图保存到驱动器中,但得到黑色(空)


您的回答将不胜感激。

这些项目将用于桌面环境,而不是网页(第一个链接上的项目完全错误!)

您将获得一个黑屏,因为您捕获了应用程序运行的屏幕,因此您将获得服务器的屏幕,如果没有用户登录,屏幕将是黑色的

您不能使用此代码捕获远程web客户端屏幕

尝试改用WebBrowser控件,并在位图上渲染结果:



代码隐藏:

using System.IO;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
protected void Capture(object sender, EventArgs e)
{
    string url = txtUrl.Text.Trim();
    Thread thread = new Thread(delegate()
    {
        using (WebBrowser browser = new WebBrowser())
        {
            browser.ScrollBarsEnabled = false;
            browser.AllowNavigation = true;
            browser.Navigate(url);
            browser.Width = 1024;
            browser.Height = 768;
            browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(DocumentCompleted);
            while (browser.ReadyState != WebBrowserReadyState.Complete)
            {
                System.Windows.Forms.Application.DoEvents();
            }
        }
    });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
    thread.Join();
}

private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    WebBrowser browser = sender as WebBrowser;
    using (Bitmap bitmap = new Bitmap(browser.Width, browser.Height))
    {
        browser.DrawToBitmap(bitmap, new Rectangle(0, 0, browser.Width, browser.Height));
        using (MemoryStream stream = new MemoryStream())
        {
            bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
            byte[] bytes = stream.ToArray();
            imgScreenShot.Visible = true;
            imgScreenShot.ImageUrl = "data:image/png;base64," + Convert.ToBase64String(bytes);
        }
    }
}

实际问题似乎是“如何使用Javascript捕获屏幕截图”?这已经在前面的SO问题中得到了回答。答案是使用库读取页面的DOM并使用画布呈现图像

例如,以下代码将捕获当前页面并在页面底部发布结果:

html2canvas(document.body, {
  onrendered: function(canvas) {
    document.body.appendChild(canvas);
  }
});
要呈现不同的元素,请将其传递给html2canvas,而不是
document.body

html2canvas(someElement,...);

但是呈现IFRAME可能是一个问题,因为它的内容不是页面的一部分,因此不是DOM。Javascript根本无法访问其内容。这被称为
html2canvas

Giox的一个限制,谢谢您的回答。因此,您可以建议我使用web应用程序(mvc)捕获当前屏幕窗口的方法吗。我也尝试过html2canvas。它也很好用。。但它不支持iframe内容。请尝试编辑中发布的代码,它不是MVC,因为我不太擅长它,但您可以轻松地将其转换为我的web应用程序中的另一项功能。我正在使用ajax做许多事情。。所以,如果我传递url,那么它将不适用于我。因为如果页面重新加载,我将丢失值。所以我想用我新的ajax调用捕获当前屏幕上的任何显示。Giox,他们有没有办法不通过当前页面url就可以在web应用程序上以图像的形式获取活动屏幕?你在嗅探用户信息吗??帧必须位于同一域中。这是安全政策,你有XY问题。您不能也不应该从服务器上截取浏览器的屏幕截图。你为什么要这么做?在我的网页上有一个iframe。和来自第三方网站的iframe。我在框架中没有任何控件,只有我可以在一些控件中添加值。因此,对于我的日志,我希望捕获附加值并将其存储为图像。现在,请告诉我从mvc应用程序中执行此操作的最佳方法是什么。您还可以阅读下面的回答意见以了解更多说明。当您尝试捕获服务器端的桌面时,您正在尝试捕获服务器端的桌面。但是Web服务器没有台式机,这就是为什么会出现黑色图像的原因。您无法用服务器代码捕获用户浏览器的屏幕截图。@JatinGadhiya发布了一个不同的问题,询问您真正想做什么。事实上,实际问题隐藏在第6条评论中,可读性不强。在任何情况下,在浏览器上执行任何操作都涉及Javascript、浏览器扩展或Flash@JatinGadhiya发布一个新问题。原文中没有任何一条有任何帮助。事实上,您可能会问“如何使用Javascript捕获屏幕截图?”。如果你对此感兴趣,第一个答案就是指向图书馆