Как сделать растровое изображение только окна в С#?

Моя цель - сделать растровое изображение окна и только этого окна. Мне также нужно будет иметь возможность создавать растровые изображения определенных областей пикселей в этом окне. Эти регионы не являются оконными формами или чем-то подобным.

Я подумал, что создание экрана из дескриптора окна, а затем запись областей экрана, которые мне нужны, в растровое изображение, было бы хорошим решением этой проблемы.

Вот что я сделал:

 Process[] processlist = Process.GetProcesses();
        String[] process = null;
        process = new string[200];
        int i = 0;
        IntPtr handle = IntPtr.Zero;
        foreach (Process theprocess in processlist)
        {
            process[i] = theprocess.MainWindowTitle;
            if (process[i].Contains("Title of Process"))
            {
                handle = theprocess.MainWindowHandle;
                MessageBox.Show("Handle Set");

                break;
            }
            i++;

        }

        //Sets new screen from Handle

        Screen thescreen = Screen.FromHandle(handle);

        //Bitmap stored
        Bitmap bmpScreenshot = new Bitmap(thescreen.Bounds.Width, thescreen.Bounds.Height);

        //Graphics object to draw screen in bitmap
        Graphics g = Graphics.FromImage(bmpScreenshot);

        //Copy from screen to bitmap
        g.CopyFromScreen(0, 0, 0, 0, thescreen.Bounds.Size);

Однако это просто получает растровое изображение всего экрана. Как я могу уменьшить это до размера всего одного окна?

Спасибо.


person Ethan Kershner    schedule 08.06.2014    source источник
comment
Вы должны pinvoke GetWindowRect(), чтобы получить положение и размер окна .   -  person Hans Passant    schedule 08.06.2014


Ответы (1)


Ты можешь это сделать:

Bitmap bmpScreenshot = new Bitmap(this.Bounds.Width, this.Bounds.Height);
DrawToBitmap(bmpScreenshot, this.DisplayRectangle);
pictureBox1.Image = bmpScreenshot;

Я пробовал приведенный выше код, и он работал нормально

person Syed Farjad Zia Zaidi    schedule 08.06.2014
comment
Заменить ли это дескриптором окна, которое я хочу захватить? - person Ethan Kershner; 08.06.2014
comment
Да, он будет отображать всю область формы, кроме границы. - person Syed Farjad Zia Zaidi; 08.06.2014
comment
Когда я заменяю это дескриптором окна, я хочу сделать снимок экрана: «System.IntPtr» не содержит определения для «Границы», и не может быть найден метод расширения «Границы», принимающий первый аргумент типа «System.IntPtr». (вам не хватает директивы using или ссылки на сборку?' Окно, которое я хочу захватить, не является окном формы, в которой работает программа. - person Ethan Kershner; 08.06.2014
comment
Если вы пытаетесь получить экран другой формы, вам придется вызывать его следующим образом: form2.DrawToBitmap(bmpScreenshot, s.DisplayRectangle); - person Syed Farjad Zia Zaidi; 08.06.2014
comment
Это не форма, а окно полностью вне самой программы. - person Ethan Kershner; 08.06.2014
comment
stackoverflow.com/questions/891345 / Перейдите по этой ссылке, и вы получите ответ... - person Syed Farjad Zia Zaidi; 08.06.2014