0

我想截取外部网站的屏幕截图。目前我的工作流程是使用指定的 URL 启动一个 Firefox 实例,并使用 Win32 API 中的 PrintWindow 截屏

当我在 IISExpress 中运行此应用程序时,它工作正常,但是当我在 Windows VPS 上的 IIS 中运行相同的应用程序时,它无法正常工作(屏幕截图为空白)。

我不知道我做错了什么?

我的代码:

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security;
using System.Threading;
using System.Web;

namespace WebTools.Web
{
    public class RemoteScreenshot
    {
        public static Bitmap TakeScreenshot(Process process)
        {
            // may need a process Refresh before
            return TakeScreenshot(process.MainWindowHandle);
        }

        public static Bitmap TakeScreenshot(IntPtr handle)
        {
            RECT rc = new RECT();
            GetWindowRect(handle, ref rc);

            Bitmap bitmap = new Bitmap(rc.right - rc.left, rc.bottom - rc.top);

            using (Graphics graphics = Graphics.FromImage(bitmap))
            {
                PrintWindow(handle, graphics.GetHdc(), 0);
            }

            return bitmap;
        }

        [DllImport("user32.dll")]
        private static extern bool GetWindowRect(IntPtr hWnd, ref RECT rect);

        [DllImport("user32.dll")]
        private static extern bool PrintWindow(IntPtr hWnd, IntPtr hDC, int flags);

        [StructLayout(LayoutKind.Sequential)]
        private struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }

        public static void Save(string url, string file, int timeout = 0)
        {
            var proc = Process.Start(new ProcessStartInfo("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe", url)
            {
                CreateNoWindow = false,
                WindowStyle = ProcessWindowStyle.Maximized
            });

            Thread.Sleep(timeout);

            var bitmap = TakeScreenshot(proc);

            bitmap.Save(file, ImageFormat.Png);
            bitmap.Dispose();

            proc.Kill();
        }
    }
}

编辑:运行 Firefox 工作正常,因为 AppPool 位于另一个有权执行 Firefox 的帐户下。

4

3 回答 3

0

使用 IIS,您无法截取屏幕截图,因为它在 Windows 服务器的 NetworkService 帐户下工作

于 2013-10-20T09:44:03.957 回答
0

你要截屏哪个屏幕?

如果应用程序在笔记本电脑上运行,它将绘制到物理显示适配器。如果它在 RDP 会话结束时在机器上运行,它将绘制到虚拟显示适配器,并且图像将通过网络发送。

但是,如果应用程序在非交互式会话中运行,则没有显示。 应用程序不会收到 WM_PAINT 消息,因此不会绘制任何内容。

没有要捕获的屏幕位图。

于 2013-10-20T16:38:32.980 回答
-2

IIS 服务无权访问服务器桌面。IIS 中的 ASP.NET 代码运行在服务器端。它将尝试捕获服务器的屏幕,但被拒绝。

您将需要使用在客户端机器上运行代码的 silverlight。以下链接可能会有所帮助:

捕获 Silverlight 屏幕

出于安全原因,在浏览器中使用网页的用户可能需要提供权限。

于 2013-10-20T09:51:40.567 回答