2013-07-01 1 views
3

У меня есть эта строка:Есть ли способ скрыть окно Chrome и сделать снимок экрана или преобразовать окно Chrome в изображение?

Process.Start("chrome.exe", 
       "http://www.cnn.com"); 

Это открывающимися новое окно браузера хром. Я хочу сделать две вещи:

  1. Чтобы преобразовать/сохранить хромированное окно как изображение.
  2. Чтобы скрыть это окно.

Это код им пытаются сейчас в новом классе:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 
using System.Drawing.Imaging; 
using System.Drawing; 

namespace GatherLinks 
{ 
    class WebSiteScreenShot 
    { 
     [DllImport("user32.dll")] 
     private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 
     [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 WebSiteScreenShot() 
     { 

     } 

     public void WhateverMethod() 
     { 
      //initialize process and get hWnd 
      Process putty = Process.Start("chrome.exe", 
       "http://www.cnn.com"); 
      putty.WaitForInputIdle(); 
      IntPtr winHandle = putty.MainWindowHandle; 

      //print screen 
      RECT rc; 
      GetWindowRect(winHandle, out rc); 

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

      PrintWindow(winHandle, hdcBitmap, 0); 

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

      bmp.Save("c:\\temp\\test.png", ImageFormat.Png); 

      //hides window 
      ShowWindowAsync(winHandle, 0); 
     } 

     [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; 
      } 
     } 

    } 
} 

Прежде всего окна хром был открыт и не скрываю. Во-вторых им получать на старте исключение на линии:

Bitmap bmp = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb); 

Исключение составляет:

ArguemntException Параметр не является допустимым

Я вижу, что ВМР является недействительным и ширина и высота равны 0

Я использовал этот код в Form1, как это:

WebSiteScreenShot wsss; 

Тогда в конструкторе:

wsss = new WebSiteScreenShot(); 
wsss.WhateverMethod(); 

И использовать контрольную точку и получил исключение.

Это исключение полное сообщение:

System.ArgumentException was unhandled 
    HResult=-2147024809 
    Message=Parameter is not valid. 
    Source=System.Drawing 
    StackTrace: 
     at System.Drawing.Bitmap..ctor(Int32 width, Int32 height, PixelFormat format) 
     at GatherLinks.WebSiteScreenShot.WhateverMethod() in d:\C-Sharp\GatherLinks\GatherLinks-2\GatherLinks\GatherLinks\WebSiteScreenShot.cs:line 38 
     at GatherLinks.Form1..ctor() in d:\C-Sharp\GatherLinks\GatherLinks-2\GatherLinks\GatherLinks\Form1.cs:line 71 
     at GatherLinks.Program.Main() in d:\C-Sharp\GatherLinks\GatherLinks-2\GatherLinks\GatherLinks\Program.cs:line 18 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: 
+1

это могло бы помочь: http://stackoverflow.com/questions/1163761/c-sharp-capture-screenshot-of-active-window –

+0

ли новая или отредактированная версия кода, который я написал для вас? –

ответ

0

редактировать

Я добавил процесс обновления и нить ждать, что должно исправить проблему, не имея MainWindowHandle, когда Chrome запускает.

Things отметить:

Process.Refresh будет работать только, если другой экземпляр хрома является НЕ работает (если хром уже запущен новый процесс вызовет новая вкладка будет открыта и будет выходить, следовательно, process.Refresh не удастся) - можно избежать других подходов, чтобы избежать этой проблемы.

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

конца редактировать

это должно сделать это

  • он запускает процесс (блокнот.ехе в этом случае)
  • ждет, пока он не будет загружен для ввода пользователя и получает обрабатывать главное окно
  • занимает экран печати данного процесса (я использовал решение Maurice предложенную в Get a screenshot of a specific application для этого, является более сложным чем некоторые другие подходы, но не требует, чтобы процесс, чтобы быть на переднем плане)
  • сохраняет изображение в C: \ Temp \ test.png
  • скрывает окно процесса с использованием ShowWindowAsync

... 
using System; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 
using System.Drawing.Imaging; 
... 
... 
     [DllImport("user32.dll")] 
     private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 
     [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 WhateverMethod() 
     { 
      //initialize process and get hWnd 
      Process chrome = Process.Start("chrome.exe","http://www.cnn.com"); 

      //wait for chrome window to open AND page to load (important for process refresh) 
      //you might need to increase the sleep time for the page to load or monitor the "loading" title on Chrome 

      System.Threading.Thread.Sleep(4000); 
      chrome.Refresh(); 
      IntPtr mainHandle = chrome.MainWindowHandle;  

      RECT rc; 
      GetWindowRect(mainHandle, out rc); 

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

      PrintWindow(mainHandle, hdcBitmap, 0); 

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

      bmp.Save("c:\\temp\\test.png", ImageFormat.Png); 
      ShowWindowAsync(mainHandle, 0); 
     } 

     [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; 
      } 
     } 

+0

Rafael Я попробовал код, добавленный вами в ответ, но я получаю сообщение об ошибке erro/exception im, обновляющее мой вопрос. –

+0

Отредактировал мой код за исключением. –

+0

Теперь я вижу, что, возможно, в Form1 мне нужно добавить сначала в конструкторе: WebSiteScreenShot.GetWindowRect (но я не уверен, что с ним делать? –

-1

Я думаю, что поздно, чтобы дать вам ответ, но для тех, у кого есть эта проблема, попробуйте: wkhtmltopdf and wkhtmltoimage. Это инструменты командной строки с открытым исходным кодом (LGPLv3) для рендеринга HTML в PDF и различные форматы изображений с использованием механизма рендеринга Qt WebKit. Они работают полностью «без головы» и не требуют отображения или отображения.

В принципе вы можете конвертировать всю веб-страницу в формат PDF или изображения.

Смежные вопросы