2016-07-25 2 views
0

Мне нужно сделать снимок экрана неактивного внешнего приложения, например TeamSpeak или Skype.Скриншот неактивного внешнего приложения

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

PS: Я хочу сделать снимок экрана только для приложения, поэтому, если другое приложение находится поверх того, которое я хочу, было бы проблемой?

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

Спасибо за помощь.

ответ

1

В API вы после PrintWindow:

void Example() 
{ 
    IntPtr hwnd = FindWindow(null, "Example.txt - Notepad2"); 
    CaptureWindow(hwnd); 
} 

[DllImport("User32.dll", SetLastError = true)] 
[return: MarshalAs(UnmanagedType.Bool)] 
static extern bool PrintWindow(IntPtr hwnd, IntPtr hDC, uint nFlags); 

[DllImport("user32.dll")] 
static extern bool GetWindowRect(IntPtr handle, ref Rectangle rect); 

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

public void CaptureWindow(IntPtr handle) 
{ 
    // Get the size of the window to capture 
    Rectangle rect = new Rectangle(); 
    GetWindowRect(handle, ref rect); 

    // GetWindowRect returns Top/Left and Bottom/Right, so fix it 
    rect.Width = rect.Width - rect.X; 
    rect.Height = rect.Height - rect.Y; 

    // Create a bitmap to draw the capture into 
    using (Bitmap bitmap = new Bitmap(rect.Width, rect.Height)) 
    { 
     // Use PrintWindow to draw the window into our bitmap 
     using (Graphics g = Graphics.FromImage(bitmap)) 
     { 
      IntPtr hdc = g.GetHdc(); 
      if (!PrintWindow(handle, hdc, 0)) 
      { 
       int error = Marshal.GetLastWin32Error(); 
       var exception = new System.ComponentModel.Win32Exception(error); 
       Debug.WriteLine("ERROR: " + error + ": " + exception.Message); 
       // TODO: Throw the exception? 
      } 
      g.ReleaseHdc(hdc); 
     } 

     // Save it as a .png just to demo this 
     bitmap.Save("Example.png"); 
    } 
} 
+0

PrintWindow возвращает false, так значит ли это, что он не работает? – Haytam

+0

Да, HWND, который вы подаете, недействителен, или целевое окно отключает поддержку PrintWindow. 'Marshal.GetLastWin32Error' может содержать больше информации о сбое. –

+0

Я считаю, что HWND, который я получил, действителен, потому что GetWindowRect отлично работает. Как работает Marshal.GetLastWin32Error? – Haytam

1

Использование GetWindowRect в сочетании с PrintWindow из user32 API должно быть всем необходимым для реализации этой функции. PrintWindow будет правильно захватывать содержимое конкретного приложения, даже если оно закрыто другим окном поверх него.

Стоит отметить, что это может не сработать для записи содержимого окон DirectX.

+0

Спасибо, получил это работает с этими двумя API. – Haytam

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