如何在c#中从Teamviewer窗口捕获屏幕截图?

如何在c#中从Teamviewer窗口捕获屏幕截图?,c#,winforms,C#,Winforms,我想用我正在开发的程序自动化一些任务。然而,要做到这一点,我想从远程机器捕获屏幕截图。我已通过Teamviewer连接到此远程计算机。我只需要从中捕获一个屏幕截图,处理它,完成任务并重复 问题是,如何在带有c#windoww窗体的Windows上捕获Teamviewer窗口的屏幕截图 主windows窗体代码: public partial class Form1 : Form { public Form1() { Initiali

我想用我正在开发的程序自动化一些任务。然而,要做到这一点,我想从远程机器捕获屏幕截图。我已通过Teamviewer连接到此远程计算机。我只需要从中捕获一个屏幕截图,处理它,完成任务并重复

问题是,如何在带有c#windoww窗体的Windows上捕获Teamviewer窗口的屏幕截图

主windows窗体代码:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            //Start capture
            IntPtr handle = Capturer.GetHandle("Teamviewer", this.Handle);
            Bitmap bmp = Capturer.PrintWindow(handle);

            //Process Image

            pictureBox1.Image = bmp;
        }
    }
这是capturer类:

 public class Capturer
    {
        [DllImport("user32.dll")]
        public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
        [DllImport("user32.dll")]
        public static extern bool PrintWindow(IntPtr hWnd, IntPtr hdcBlt, int nFlags);

        public static Bitmap PrintWindow(IntPtr hwnd)
        {
            RECT rc;
            GetWindowRect(hwnd, out rc);

            Bitmap bmp = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb);
            Graphics gfxBmp = Graphics.FromImage(bmp);
            IntPtr hdcBitmap = gfxBmp.GetHdc();

            PrintWindow(hwnd, hdcBitmap, 0);

            gfxBmp.ReleaseHdc(hdcBitmap);
            gfxBmp.Dispose();

            return bmp;
        }

        public static IntPtr GetHandle(String windowName, IntPtr selfVal)
        {
            Process[] processlist = Process.GetProcesses();
            foreach (Process process in processlist)
            {
                if (!String.IsNullOrEmpty(process.MainWindowTitle))
                {
                    String name = process.ProcessName;
                    int id = process.Id;
                    String title = process.MainWindowTitle;

                    if (title.Contains(windowName)){
                        return process.MainWindowHandle;
                    }
                }
            }

            return selfVal ;
        }
    }
这是RECT类:

[StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        private int _Left;
        private int _Top;
        private int _Right;
        private int _Bottom;

        public RECT(RECT Rectangle) : this(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom)
        {
        }
        public RECT(int Left, int Top, int Right, int Bottom)
        {
            _Left = Left;
            _Top = Top;
            _Right = Right;
            _Bottom = Bottom;
        }

        public int X
        {
            get { return _Left; }
            set { _Left = value; }
        }
        public int Y
        {
            get { return _Top; }
            set { _Top = value; }
        }
        public int Left
        {
            get { return _Left; }
            set { _Left = value; }
        }
        public int Top
        {
            get { return _Top; }
            set { _Top = value; }
        }
        public int Right
        {
            get { return _Right; }
            set { _Right = value; }
        }
        public int Bottom
        {
            get { return _Bottom; }
            set { _Bottom = value; }
        }
        public int Height
        {
            get { return _Bottom - _Top; }
            set { _Bottom = value + _Top; }
        }
        public int Width
        {
            get { return _Right - _Left; }
            set { _Right = value + _Left; }
        }
        public Point Location
        {
            get { return new Point(Left, Top); }
            set
            {
                _Left = value.X;
                _Top = value.Y;
            }
        }
        public Size Size
        {
            get { return new Size(Width, Height); }
            set
            {
                _Right = value.Width + _Left;
                _Bottom = value.Height + _Top;
            }
        }

        public static implicit operator Rectangle(RECT Rectangle)
        {
            return new Rectangle(Rectangle.Left, Rectangle.Top, Rectangle.Width, Rectangle.Height);
        }
        public static implicit operator RECT(Rectangle Rectangle)
        {
            return new RECT(Rectangle.Left, Rectangle.Top, Rectangle.Right, Rectangle.Bottom);
        }
        public static bool operator ==(RECT Rectangle1, RECT Rectangle2)
        {
            return Rectangle1.Equals(Rectangle2);
        }
        public static bool operator !=(RECT Rectangle1, RECT Rectangle2)
        {
            return !Rectangle1.Equals(Rectangle2);
        }

        public override string ToString()
        {
            return "{Left: " + _Left + "; " + "Top: " + _Top + "; Right: " + _Right + "; Bottom: " + _Bottom + "}";
        }

        public override int GetHashCode()
        {
            return ToString().GetHashCode();
        }

        public bool Equals(RECT Rectangle)
        {
            return Rectangle.Left == _Left && Rectangle.Top == _Top && Rectangle.Right == _Right && Rectangle.Bottom == _Bottom;
        }

        public override bool Equals(object Object)
        {
            if (Object is RECT)
            {
                return Equals((RECT)Object);
            }
            else if (Object is Rectangle)
            {
                return Equals(new RECT((Rectangle)Object));
            }

            return false;
        }
    }

这样做与从任何其他窗口捕获屏幕截图不同吗如果你搜索的话,这里有很多答案告诉你怎么做。听起来很棒。你能告诉我们你到目前为止开发了什么吗?是的,我设法从其他程序中截取了屏幕截图。但teamviewer似乎在某种程度上阻止了这一点。我将编辑问题,以包括迄今为止的进展。相关,可能重复