截图:Windows Server中的窗体中带有Web浏览器控件的WinForms应用程序

时间:2013-03-12 12:52:12

标签: c# winforms windows-server-2008

我使用以下代码捕获Form屏幕截图:

            this.TopMost = true;
            this.FormBorderStyle = FormBorderStyle.None;
            this.WindowState = FormWindowState.Maximized;
            this.Activate();
            Application.DoEvents();



            Bitmap screenShotBMP = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
            Graphics screenShotGraphics = Graphics.FromImage(screenShotBMP);
            screenShotGraphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            screenShotBMP.Save(imagePath, ImageFormat.Gif);
            screenShotGraphics.Dispose();
            screenShotBMP.Dispose();


            this.TopMost = false;
            this.FormBorderStyle = FormBorderStyle.Sizable;
            this.WindowState = FormWindowState.Minimized;

当我登录到服务器时,它工作正常(我可以看到生成的屏幕截图)但是当它被锁定时,行:

        screenShotGraphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
  

给出错误“句柄无效”。

我开始知道它是因为没有人登录时没有桌面。所以有人可以让我知道任何替代方案吗?

我所拥有的是WinForms应用程序,计划在每5分钟后运行一次,当它运行时,我必须截取Form的屏幕截图。

请让我知道一个解决方案。

2 个答案:

答案 0 :(得分:0)

这是不可能的。当工作站被锁定时,Winlogon会切换到安全桌面。在这种情况下,就像你说的那样,没有桌面可以拍照。

管理员甚至没有安全桌面的访问权限,因此即使您愿意,也无法拍摄 it 的照片。解决与此相关的安全限制的唯一可行方法是将应用程序重写为服务,以便获得对安全桌面的访问权限,但之后会遇到另一组安全限制:即,不允许服务以任何方式与用户交互,因此没有“桌面”。

目前还不清楚在这种情况下你甚至会发现期望。如果没有桌面可以拍照,那么你会想要来拍摄一张照片?

最重要的是,Windows是一个多用户操作系统,已经存在了几十年。您必须放弃这个16位概念模型,其中只有一个“桌面”,每个人都拥有对所有内容的完全访问权限。

还有其他更好的方法可以监控工作站上发生的事情,而不是定期截屏...实际工作方式甚至可行。我不能提出一般性的建议,因为这取决于你究竟想要监控的是什么。

答案 1 :(得分:0)

我刚刚测试了PrintWindow api,它锁定了我的桌面:C# PrintWindow returns a black image