如何检测运行ASP.NET程序的监视器?

时间:2011-07-18 19:51:59

标签: c# asp.net multiple-monitors

我已经阅读了大量其他问题并搜索了这个问题,但如果我使用winforms,我只能弄明白该怎么做。我目前正在编写一个库,该库的一个功能是处理日志记录。我正在实现的功能之一是在将问题写入日志之前自动获取页面的屏幕截图。这个问题是我不知道哪个监视器截取屏幕截图,所以如果用户将浏览器移动到不同的监视器,我仍然会拍摄主要监视器。

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控件的东西?

8 个答案:

答案 0 :(得分:7)

这是行不通的。您的c#代码在Web服务器上运行,而不是在用户的Web浏览器上运行,而不是在他们的计算机上运行。代码可以访问的唯一监视器是连接到Web服务器的监视器。

这可能出现在您的开发平台上工作,但这只是因为您的Web服务器和客户端计算机是相同的计算机。

您可以期待的最好的方法是在页面上包含可以捕获的flash或silverlight对象,甚至可能无效。

答案 1 :(得分:4)

当然,您在此处运行的任何代码都将在服务器上运行,因此无法知道它的显示位置

理论上你可以使用JS来捕获DOM,然后通过Ajax调用将它发送回服务 - 这是你能得到的最接近的

答案 2 :(得分:3)

您是否尝试从ASP.NET应用程序中截取客户端屏幕的屏幕截图?那是不可能的。您可以记录整个请求,包括HTML,然后在其他地方重新呈现它,但是您无法从服务器端应用程序框架与客户端进行那种交互。

答案 3 :(得分:2)

  

如果用户将浏览器移动到另一台显示器,我仍然会拍摄主要显示器

ASP.NET在服务器上运行,因此编写服务器代码以截屏浏览器是没有意义的。您可能有更好的运气使用客户端代码(javascript)来截取屏幕截图。

此主题使用ActiveX解决方案: Take a screenshot of a webpage with JavaScript?

答案 4 :(得分:2)

ASP.Net WebForms不像您可能认为的那样工作。简短的回答是不,你不能在ASP.Net中这样做。没有等价物。

WinForms通过与Windows操作系统交互显示,并显示在同一台计算机的桌面上。通过生成HTML并将HTML发送到另一台计算机的浏览器来显示WebForms。您的ASP.Net代码未在其他计算机的浏览器上运行。如果您的代码试图拍摄屏幕截图,那么至少可以获得服务器(或计算机)的显示。

您可以使用JavaScript在浏览器上运行代码 - 但您仍然不应该使用屏幕截图(我认为JavaScript不会让您 - 至少不会自动)。例如,您将在屏幕上包含可能不相关的其他信息。

当ASP.Net遇到问题时,它会在服务器上的Windows日志中记录详细信息,并在IIS日志文件中记录(详细程度较少)。当遇到错误时,请考虑通过电子邮件向自己发送警报,并查看日志以查看出现了什么问题。

答案 5 :(得分:1)

我会窃取google +目前使用的算法。我绝对没有确切的算法,甚至没有接近实际的算法,但我认为这就是它正在做的事情:

  • 用户点击“日志/报告错误”
  • 服务器使用滚动条的位置和窗口的大小(可通过JS访问)呈现当前页面。
  • 服务器呈现覆盖整个窗口的div并将图像放在其中。这个div具有最高的z指数。
  • 当用户点击div时,会生成一个新div,允许用户“突出显示”所选区域。然后,允许用户将评论附加到该选定区域。

这是执行中的天才。

答案 6 :(得分:0)

我能想到的唯一可能性是客户端要求浏览器截取屏幕然后上传它。 FogBugz使用它的新案例工具做了类似的事情,但这是用户必须下载和安装的插件。

答案 7 :(得分:0)

我很久以前使用用--gasp - Visual Basic编写的ActiveX控件为bug跟踪应用做了这个。这样的事情(除了提到的酷炫的Google+技巧)是关于你唯一的选择。