Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何检测ASP.NET程序正在哪个监视器上运行?_C#_Asp.net_Multiple Monitors - Fatal编程技术网

C# 如何检测ASP.NET程序正在哪个监视器上运行?

C# 如何检测ASP.NET程序正在哪个监视器上运行?,c#,asp.net,multiple-monitors,C#,Asp.net,Multiple Monitors,我已经阅读了大量的其他问题,并在谷歌上搜索了这个问题,但我只有在使用winforms的情况下才能找到解决方法。我目前正在编写一个库,该库的功能之一是处理日志记录。我为它实现的一个功能是在将问题写入日志之前自动截取页面的屏幕截图。问题是,我不知道要拍摄哪个显示器的屏幕截图,因此如果用户将浏览器移动到其他显示器,我仍然会拍摄主显示器的屏幕截图 public static Bitmap ScreenShot(string saveLocation, string fileName) { Bit

我已经阅读了大量的其他问题,并在谷歌上搜索了这个问题,但我只有在使用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控件的东西?

当然,您在这里运行的任何代码都将在服务器上运行,因此不知道它显示在哪里


从理论上讲,您可以使用JS捕获DOM,然后通过Ajax调用将其发送回服务-我认为这是最接近的方法,但这行不通。您的c#代码在web服务器上运行,而不是在用户的web浏览器上,也不是在他们的计算机上。代码可以访问的唯一监视器是连接到web服务器的监视器

这可能在您的开发平台上起作用,但这仅仅是因为您的web服务器和客户机是同一台机器


你最希望的就是在页面上添加一个flash或silverlight对象,这样就可以拍摄到截图,即使这样也可能不起作用。

我能想到的唯一可能是客户端请求浏览器拍摄截图,然后上传。FogBugz通过其新的case工具实现了类似的功能,但这是用户必须下载和安装的附加组件。

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

如果用户将浏览器移动到另一个监视器,我仍然会拍摄主监视器

ASP.NET在服务器上运行,因此编写服务器代码以截屏浏览器是毫无意义的。使用客户端代码(javascript)截图可能会更幸运

此线程使用ActiveX解决方案:

ASP.Net Web表单的工作方式与您可能认为的不同。简短的回答是“不”,您不能在ASP.Net中执行此操作。没有对等的标准

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

您可以使用JavaScript在浏览器上运行代码,但您仍然不应该截屏(我认为JavaScript不会让您这样做,至少不会自动这样做)。首先,您将包括他们屏幕上可能不相关的其他信息


当ASP.Net遇到问题时,它会将详细信息记录在服务器上的Windows日志中,也会(不太详细)记录在IIS日志文件中。考虑在遇到错误时给自己发一个警报,并在日志中查看错误所在。

< P>我会窃取谷歌目前使用的算法。我肯定没有精确的算法,甚至没有一个接近实际情况的算法,但我认为这就是它所做的:

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

这在执行上是个天才。

很久以前,我为一个bug跟踪应用程序做了这项工作,使用了一个用VisualBasic编写的ActiveX控件。像这样的东西(除了上面提到的酷Google+技巧)是你唯一的选择。

是的,我不完全确定它会起作用,但我希望,因为所有关于拍摄ASPX页面屏幕截图的容易找到的教程,这在某种程度上是可能的。在Silverlight和Flash中,你都可以捕获屏幕。但是,它将仅捕获浏览器的Silverlight/Flash客户端区域。换句话说,只有运行Silverlight组件的浏览器部分将被捕获。如果我发现这不起作用(我想它真的不起作用),DOM是我下一步要尝试的东西。谢谢你的回答!从根本上说,在ASP.Net中截屏是不可能的。你的screenshot()方法运行在服务器端-它怎么可能截屏客户端?这难道不是只有在浏览器与ASP服务器运行在同一台计算机上时才起作用吗?抓取你的代码并转换为javascript:)。即使这样,ASP.Net怎么知道?使用localhost的技巧?