使用 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的帐户下。
您要截取什么屏幕的屏幕截图?
如果应用程序在笔记本电脑上运行,它将绘制到物理显示适配器。 如果它在 RDP 会话结束时在计算机上运行,它将绘制到虚拟显示适配器,并且图像将通过线路发送。
但是,如果应用程序在非交互式会话中运行,则没有显示。 应用程序不会收到WM_PAINT消息,因此不会绘制任何内容。
没有要捕获的屏幕位图。
使用 IIS,您无法拍摄屏幕截图,因为它在 Windows 服务器中的网络服务帐户下工作
IIS 服务无权访问服务器桌面。IIS 中的 ASP.NET 代码在服务器端运行。它将尝试捕获被拒绝的服务器的屏幕。
您将需要使用在客户端计算机上运行代码的 silverlight。以下链接可能会有所帮助:
捕获银光屏幕
出于安全原因,在浏览器中使用网页的用户可能需要提供权限。