2016-07-25 48 views
0

Ich muss einen Screenshot von einer nicht aktiven externen Anwendung, z. B. TeamSpeak oder Skype.Screenshot nicht aktive externe Anwendung

Ich habe gesucht und ich habe nicht viel gefunden, ich weiß, dass es nicht möglich ist, eine minimierte Anwendung Screenshot, aber ich denke, es sollte möglich sein, eine nicht aktive Anwendung Screenshot.

PS: Ich möchte Screenshot nur die Anwendung, also, wenn eine andere Anwendung auf der einen ist, die ich will, wäre es ein Problem?

ich jetzt keinen Code haben, habe ich eine user32 API gefunden, die tun kann, was ich will, aber ich habe den Namen vergessen ..

Danke für die Hilfe.

Antwort

1

Die API sind Sie nach ist 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 gibt false zurück, also bedeutet es, dass es nicht funktioniert? – Haytam

+0

Ja, entweder das HWND, das Sie einspeisen, ist ungültig, oder das Zielfenster hat die Unterstützung für PrintWindow deaktiviert. 'Marshal.GetLastWin32Error' enthält möglicherweise weitere Informationen zum Fehler. –

+0

Ich glaube, das HWND, das ich bekomme, ist gültig, weil das GetWindowRect perfekt funktioniert. Wie funktioniert Marshal.GetLastWin32Error? – Haytam

1

Die Verwendung von GetWindowRect gekoppelt mit PrintWindow von user32 API sollte alles sein, was Sie zum Implementieren der Funktion benötigen. PrintWindow erfasst den Inhalt einer bestimmten Anwendung auch dann korrekt, wenn sie von einem anderen darüber liegenden Fenster verdeckt wird.

Es ist erwähnenswert, dass dies möglicherweise nicht funktioniert, um Inhalte von DirectX-Fenstern zu erfassen.

+0

Danke, habe es mit diesen beiden APIs arbeiten. – Haytam