2015-11-12 6 views
1

Je suis en train de capturer une partie carrée de l'écran à l'aide GDI sous Windows 10. Voici comment j'ai essayé:BitBlt capture seulement écran partiel

//Get screen DC 
desktop = GetDC(NULL); 

//Create a compatible bitmap of 32 x 32 px. 
HDC hCaptureDC = CreateCompatibleDC(desktop); 
HBITMAP captureBmp = CreateCompatibleBitmap(hCaptureDC, 32, 32); 
SelectObject(hCaptureDC, captureBmp); 

//loop: 
BitBlt(hCaptureDC, 0, 0, 32, 32, desktop, sourceX, sourceY, SRCCOPY); 
BitBlt(desktop, 0, 0, 32, 32, hCaptureDC, 0, 0, SRCCOPY); 

donc je capture un rectangle 32x32 px à (sourceX, sourceY) dans le bitmap et dessinez-le sur l'écran (coin supérieur gauche).

Cependant, cela se traduit principalement par des carrés noirs. Seules les choses qui ont été dessinées par GDI avant d'être capturé. Je suis tout à fait sûr que le premier BitBlt est le problème. Si je spécifie WHITENESS comme dernier paramètre, j'obtiens un carré blanc, ce qui est ce que j'attendrais. Donc, la capture de l'écran à l'image bitmap semble être problématique.

Si je copie directement d'un écran à l'aide

BitBlt(desktop, 0, 0, 32, 32, desktop, sourceX, sourceY, SRCCOPY); 

, tout fonctionne comme prévu. J'ai également essayé le drapeau CAPTUREBLT.

Comment puis-je capturer toute la région dans le bitmap?

Répondre

3

Cette ligne

HBITMAP captureBmp = CreateCompatibleBitmap(hCaptureDC, 32, 32); 

devrait être

HBITMAP captureBmp = CreateCompatibleBitmap(desktop, 32, 32); 

La raison est expliquée sur le documentation page pour CreateCompatibleBitmap:

Lorsqu'un contexte de dispositif de mémoire est créé, il a d'abord une Bitmap monochrome 1 par 1 sélectionné dans celui-ci. Si ce contexte de périphérique de mémoire est utilisé dans CreateCompatibleBitmap, le bitmap qui est créé est un bitmap monochrome. Pour créer une image bitmap couleur, utilisez le HDC qui a été utilisé pour créer le contexte du périphérique de stockage