【问题标题】:Take screenshot: WinForms application with Web Browser Control in Form in Windows Server截屏:Windows Server 窗体中带有 Web 浏览器控件的 WinForms 应用程序
【发布时间】:2013-03-12 12:52:12
【问题描述】:

我正在使用以下代码截取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 的屏幕截图。

请告诉我一个解决方案。

【问题讨论】:

标签: c# winforms windows-server-2008


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我想截取Form的截图,而不是桌面。
  • 没有桌面就没有表格。表单在桌面上运行。
  • 如果我转换成服务,并授予它访问安全桌面的权限,它是否能够截取屏幕截图?
  • "那么您将遇到另一组安全限制:即不允许服务以任何方式与用户交互,因此没有“桌面”。"
  • 所以关键是不可能的,对吧?所以我该怎么做 ?基本上,该应用程序在 Web 浏览器控件中打开网站并检查登录是否成功。如果不是,请截取屏幕截图并邮寄。我有什么选择?
【解决方案2】:

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

【讨论】:

  • 我明天试试,然后告诉你。如果它有效,它将成为我的救命稻草。提前致谢。
  • PrintWindow 函数将WM_PRINT 消息发送到窗口。 WM_PRINT 消息指示窗口将自身绘制到指定的设备上下文中。这一切都很好,除了 WinForms Control.DrawToBitmap 函数已经在执行此操作(向底层控制窗口发送 WM_PRINT 消息),并且我们已经 already established 认为这不适用于 @Akshay。
猜你喜欢
  • 2011-06-14
  • 2018-01-11
  • 2012-02-08
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 2021-12-02
  • 2020-04-26
相关资源
最近更新 更多