none
Как можно сделать скриншот главного окна приложения? RRS feed

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

  • Вот один из методов, который позволяет сделать скриншот. Будем использовать приложения ‘блокнот’ для примера. Для того, чтобы сделать скриншот, необходимо:

    1. Использовать свойство Process.MainWindowHandle для получения информации о процессе, скриншот которого вы хотите сделать
    2. Использовать WinAPI функцию SetForegroundWindow для того, чтобы перенести окно приложения на передний план (сделать приложение активным)
    3. Использовать дескриптор окна, в качестве первого параметра функции GetWindowRect для того, чтобы узнать расположение необходимого окна
    4. Определить координаты окна на экране, использую данные полученные в шаге 3
    5. Использовать координаты, полученные на шаге 4, для того чтобы получить скриншот, используя функцию Graphics.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();
                }           
               }
             } 
          }
        }
      }
    
    

     


    Для связи [mail]
    1 февраля 2011 г. 14:38

Все ответы