使用 Win32 API (C# pInvoke) 在 IIS 中不起作用进行屏幕截图

本文关键字:IIS 不起作用 屏幕截图 API Win32 pInvoke 使用 | 更新日期: 2023-09-27 18:36:03

我想截取外部网站的屏幕截图。目前我的工作流程是使用指定的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的帐户下。

使用 Win32 API (C# pInvoke) 在 IIS 中不起作用进行屏幕截图

您要截取什么屏幕的屏幕截图?

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

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

没有要捕获的屏幕位图。

使用 IIS,您无法拍摄屏幕截图,因为它在 Windows 服务器中的网络服务帐户下工作

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

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

捕获银光屏幕

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