2014-01-20 3 views
0

Я пытаюсь сделать снимок экрана определенной области (приложения) на рабочем столе. Пожалуйста, проверьте этот код ...Снимок экрана с конкретным приложением

 try 
     { 
      //Process p = Process.Start("notepad"); 
      //Process p = Process.GetProcessById(11152); 
      if (p == null) 
       Console.WriteLine("Got Null"); 
      else 
      { 
      IntPtr h = p.Handle; 
      SetForegroundWindow(h); 
      ShowWindow(h, 9); 
      Rect rect = new Rect(); 
      IntPtr error = GetWindowRect(p.MainWindowHandle, ref rect); 
      while (error == (IntPtr)0) 
      { 
       error = GetWindowRect(p.MainWindowHandle, ref rect); 
      } 
      Thread.Sleep(2000); 
      int width = rect.right - rect.left; 
      int height = rect.bottom - rect.top; 
      System.IO.FileStream fs = System.IO.File.Create(@"D:\snapshot.jpg"); 
      Bitmap bitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 
      Graphics.FromImage(bitmap).CopyFromScreen(rect.left, rect.top, 0, 0, new Size(width, height), CopyPixelOperation.SourceCopy); 
      bitmap.Save(fs, System.Drawing.Imaging.ImageFormat.Jpeg); 
      fs.Close(); 
      bitmap.Dispose(); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 

и я это за пределами этого метода ..

[DllImport("user32.dll")] 
    private static extern bool SetForegroundWindow(IntPtr hWnd); 
    [DllImport("user32.dll")] 
    private static extern bool IsIconic(IntPtr hWnd); 
    [DllImport("user32.dll")] 
    private static extern IntPtr GetForegroundWindow(); 
    [DllImport("user32.dll")] 
    private static extern IntPtr ShowWindow(IntPtr hWnd, int nCmdShow); 
    [DllImport("user32.dll")] 
    public static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect); 

    [StructLayout(LayoutKind.Sequential)] 
    public struct Rect 
    { 
     public int left; 
     public int top; 
     public int right; 
     public int bottom; 
    } 

Когда я пытаюсь открыть новое приложение и попытаться взять скриншот (например, блокнотом в этом, например,) Отлично работает. Но когда я пытаюсь сделать снимок экрана текущего приложения (например, диспетчера задач и т. Д.), Он не работает (я все еще получаю изображение маленького черного прямоугольника). Пожалуйста, помогите мне ..

+0

Проверить следующие > http://stackoverflow.com/questions/891345/get-a-screenshot-of-a-specific-application – Sameer

+0

Я проверил каждый пост относительно этого .. до сих пор could'nt найти где моя проблема лежит ... пожалуйста, дайте предложения относительно моего кода .. – user3197401

ответ

0

Изменение

IntPtr h = p.Handle; 

в

IntPtr h = p.MainWindowHandle; 

и проверить.

+0

Да .. p.MainWindowHandle работал, но я получил уменьшенное изображение заголовка. Поэтому, наконец, я использовал ShowWindowAsync (handle, SW_MAXIMIZED), чтобы получить полное изображение. Но есть еще одна проблема. иногда приложение становится активным (становится передним), а иногда и нет. Хотя я получаю изображение в обоих случаях, я по-прежнему предпочитаю, чтобы приложение не становилось после вызова функции showwindowsasync. Есть ли способ сделать это? – user3197401

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