从应用程序中获取帧

时间:2017-03-13 03:08:30

标签: c# screen-capture

我一直在努力从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个像素的边框。

enter image description here

我认为它可能与Windows对应用程序的阴影效果有关,但是禁用阴影效果 没有 消除边框。

最重要的是,我的解决方案是基于请求的,因此一旦接口更新,我就无法捕获应用程序的框架。

提前感谢您的建议!

0 个答案:

没有答案