locked
Как сделать скриншот главного окна процесса? RRS feed

  • Общие обсуждения

  • Рассмотрен как один из методов. Мы будем использовать процесс "Блокнот". Выполните следующие действия:

    1.Используем System.Diagnostics.Process.MainWindowHandle для того чтобы получить дескриптор главного окна процесса.
    2.Использование Windows API, SetForegroundWindow, перевод потока в преоритетный режим и активация окна=)
    3.GetWindowRect, определение местоположения и размера окна, относительно левого верхнего угла экрана.
    4.Использование CopyFromScreen, чтобы сделать скриншот.


    public partial class Form1 : Form
        {
            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            private static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
            [DllImport("user32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
            [return: MarshalAs(UnmanagedType.Bool)]
            private static extern bool SetForegroundWindow(IntPtr hWnd);
            [StructLayout(LayoutKind.Sequential)]
            public struct RECT
            {
                public int Left;
                public int Top;
                public int Right;
                public int Bottom;
            }
            private void button1_Click(object sender, EventArgs e)
            {
                Process proc = new Process();
                proc.StartInfo.FileName = "notepad.exe";
                proc.Start()
                proc.WaitFoInputIdle();
                if (SetForegroundWindow(proc.MainWindowHandle))
                {
                    RECT srcRect;
                    if (!proc.MainWindowHandle.Equals(IntPtr.Zero))
                    {
                        if (GetWindowRect(proc.MainWindowHandle, out srcRect))
                        {
                            int width = srcRect.Right - srcRect.Left;
                            int height = srcRect.Bottom - srcRect.Top;
    
                            Bitmap bmp = new Bitmap(width, height);
                            Graphics screenG = Graphics.FromImage(bmp);
    
                            try
                            {
                                screenG.CopyFromScreen(srcRect.Left, srcRect.Top,   
                                        0, 0, new Size(width, height),
                                        CopyPixelOperation.SourceCopy);
    
                                bmp.Save("notepad.jpg", ImageFormat.Jpeg);
                            }
                            catch (Exception ex)
                            {
                                MessageBox.Show(ex.Message);
                            }
                            finally
                            {
                                screenG.Dispose();
                                bmp.Dispose();
                            }                     
                         }
                     } 
                }
            }
        }
    


    Похожий тред: Copy From Screen Process
    • Перемещено Tagore Bandlamudi 1 октября 2010 г. 23:57 MSDN Forums consolidation (От:Visual C#)
    21 января 2010 г. 21:05