我使用以下代码捕获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
的屏幕截图。
请让我知道一个解决方案。
答案 0 :(得分:0)
这是不可能的。当工作站被锁定时,Winlogon会切换到安全桌面。在这种情况下,就像你说的那样,没有桌面可以拍照。
管理员甚至没有安全桌面的访问权限,因此即使您愿意,也无法拍摄 it 的照片。解决与此相关的安全限制的唯一可行方法是将应用程序重写为服务,以便获得对安全桌面的访问权限,但之后会遇到另一组安全限制:即,不允许服务以任何方式与用户交互,因此没有“桌面”。
目前还不清楚在这种情况下你甚至会发现期望。如果没有桌面可以拍照,那么你会想要来拍摄一张照片?
最重要的是,Windows是一个多用户操作系统,已经存在了几十年。您必须放弃这个16位概念模型,其中只有一个“桌面”,每个人都拥有对所有内容的完全访问权限。
还有其他更好的方法可以监控工作站上发生的事情,而不是定期截屏...实际工作方式甚至可行。我不能提出一般性的建议,因为这取决于你究竟想要监控的是什么。
答案 1 :(得分:0)
我刚刚测试了PrintWindow api,它锁定了我的桌面:C# PrintWindow returns a black image