我一直在努力从C#中正在运行的Windows应用程序中可靠地获取每个帧。
我的目标是每次应用程序的用户界面更新时调用方法,提供更新显示的图像作为参数。
以下是我正在尝试的当前代码:
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
namespace ApplicationFrameCapture
{
class Program
{
[DllImport("user32.dll")]
public static extern bool GetWindowRect(IntPtr hwnd, ref Rect rectangle);
public struct Rect
{
public int Left { get; set; }
public int Top { get; set; }
public int Right { get; set; }
public int Bottom { get; set; }
}
static void Main(string[] args)
{
Process[] processes = Process.GetProcesses();
foreach(Process p in processes)
{
if (p.ProcessName.Equals("notepad"))
{
Rect WindowRect = new Rect();
GetWindowRect(p.MainWindowHandle, ref WindowRect);
int width = WindowRect.Right - WindowRect.Left;
int height = WindowRect.Bottom - WindowRect.Top;
Bitmap bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb);
Graphics graphics = Graphics.FromImage(bmp);
graphics.CopyFromScreen(WindowRect.Left, WindowRect.Top, 0, 0, new Size(width, height), CopyPixelOperation.SourceCopy);
bmp.Save("c:/tmp/capture.png", ImageFormat.Png);
}
}
}
}
}
但是这个解决方案存在一些问题。但最大的问题是,由于某种原因,它会在拍摄的图像周围留下约7个像素的边框。
我认为它可能与Windows对应用程序的阴影效果有关,但是禁用阴影效果 没有 消除边框。
最重要的是,我的解决方案是基于请求的,因此一旦接口更新,我就无法捕获应用程序的框架。
提前感谢您的建议!