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