0

我正在使用以下代码来捕获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.

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

4

2 回答 2

0

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

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

目前还不清楚在这种情况下您甚至期望发生什么。如果没有桌面可以拍照,你希望它拍什么?

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

除了定期截屏之外,还有其他更好的方法来监控工作站上发生的事情……甚至可以实际工作的方法。我无法提出一般性建议,因为这取决于您要监控的具体内容。

于 2013-03-12T13:10:21.133 回答
0

我刚刚测试了 PrintWindow api,它在我的桌面锁定的情况下工作:C# PrintWindow 返回一个黑色图像

于 2013-03-12T14:58:35.083 回答