2010-07-26 20 views
1

Je tente de prendre une capture d'écran d'une fenêtre en utilisant C# .NET en appelant l'API Windows. Je suis venu avec le code suivant:Prendre une capture d'écran d'une fenêtre en utilisant C# .NET - informations sur les pixels manquants

public void ScreenshotWindow(IntPtr windowHandle) { 
     Rect Rect = new Rect(); 

     GetWindowRect(windowHandle, out Rect); 
     int width = Rect.right - Rect.left; 
     int height = Rect.bottom - Rect.top; 

     IntPtr windowDeviceContext = GetWindowDC(windowHandle); 
     IntPtr destDeviceContext = CreateCompatibleDC(windowDeviceContext); 
     IntPtr bitmapHandle = CreateCompatibleBitmap(windowDeviceContext, width, height); 
     IntPtr oldObject = SelectObject(destDeviceContext, bitmapHandle); 
     BitBlt(destDeviceContext, 0, 0, width, height, windowDeviceContext, 0, 0, CAPTUREBLT | SRCCOPY); 
     SelectObject(destDeviceContext, oldObject); 
     DeleteDC(destDeviceContext); 
     ReleaseDC(windowHandle, destDeviceContext); 

     Image screenshot = Image.FromHbitmap(bitmapHandle); 
     DeleteObject(bitmapHandle); 

     screenshot.Save("C:\\Screenshots\\" + windowHandle.ToString() + ".png", System.Drawing.Imaging.ImageFormat.Png); 
    } 

Il est une série commune d'appels API Windows pour obtenir une capture d'écran de la fenêtre.

Notez que je ne cherche pas d'autres moyens d'obtenir des captures d'écran. Je voudrais comparer la vitesse de cette approche (fixe) et la vitesse de la méthode .NET Graphics.CopyFromScreen(). Le problème est, Lorsque je tente de prendre une capture d'écran d'une fenêtre agrandie exécutant Windows 7, la barre de titre et la bordure (et parfois d'autres parties de la fenêtre) sont noires. Je pense que cela est causé soit par le fait que la fenêtre est en couches ou parce que la barre de titre de la fenêtre est gérée par la fenêtre elle-même et donc l'information de pixel est inaccessible (comme je l'ai lu quelque part).

Est-ce que quelqu'un a une idée pour résoudre ce problème?

Répondre

2

Vous appelez toutes sortes d'API dont vous devriez rester éloigné, car la capture d'écran est confortablement couverte par le framework .NET. C'est beaucoup plus simple que vous ne le pensez:

var screen = Screen.PrimaryScreen; 

using (var bitmap = new Bitmap(screen.Bounds.Width, screen.Bounds.Height)) 
using (var graphics = Graphics.FromImage(bitmap)) 
{ 
    graphics.CopyFromScreen(new Point(screen.Bounds.Left, screen.Bounds.Top), new Point(0, 0), screen.Bounds.Size); 
    bitmap.Save("Test.png", ImageFormat.Png); 
} 
+0

Merci d'avoir répondu. Mais j'ai peur d'avoir oublié de spécifier que je voulais résoudre entièrement la tâche en utilisant uniquement l'API Windows. Je voulais mesurer la vitesse de chaque approche. Désolé pour ça. – David

+0

Cette approche fonctionne-t-elle également lorsque la fenêtre n'est pas entièrement visible? (Je ne crois pas) – EralpB