2011-02-11 3 views
0

Nous avons du code dans notre application qui capture une image d'une fenêtre et l'enregistre dans un fichier PNG et le copie dans le presse-papiers (code API C++).Très haut de la fenêtre est coupé dans la capture d'image sur Windows 7

Fonctionne parfaitement sur Windows XP. Il fonctionne également sous Windows 7, sauf que les premières lignes de pixels de l'image semblent avoir été coupées, comme si la zone capturée n'incluait pas les quelques lignes supérieures de la fenêtre. Pourtant, notre code copie clairement à partir du haut de l'image, montré ci-dessous.

enter image description here

(Sous Windows XP vous voyez le plein X sur le côté droit, plus la bordure supérieure de la fenêtre)

Est-ce une aéro ou un autre effet d'affichage sur Windows 7, ou est-il un moyen de compenser cela? Ou pourrait quelque chose dans notre code peut-être causer cela? Bien sûr, nous pouvons déterminer la zone de la fenêtre et la capturer à partir de la fenêtre du client, et capturer quelques lignes plus haut, mais comment peut lignes, et cela semble arbitraire.

Il doit y avoir un défaut ou un problème fondamental ici?

Notre code est à peu près comme suit:

RECT wndRect; 
GetWindowRect(hwnd, &wndRect); 
int Width = wndRect.right - wndRect.left; 
int Height = wndRect.bottom - wndRect.top; 
BYTE *pBits = 0; 
BITMAPINFO bmpinfo = {sizeof(BITMAPINFO)}; 
bmpinfo.bmiHeader.biWidth = Width; 
bmpinfo.bmiHeader.biHeight = Height; 
bmpinfo.bmiHeader.biPlanes = 1; 
bmpinfo.bmiHeader.biBitCount = 24; 
bmpinfo.bmiHeader.biCompression = BI_RGB; 
HBITMAP hBmp = CreateDIBSection(NULL, &bmpinfo, DIB_RGB_COLORS, (void**)&pBits, NULL, 0); 
HDC hWndDC = GetWindowDC(hwnd); 
HDC hDC = CreateCompatibleDC(hWndDC); 
HBITMAP hOldBmp = (HBITMAP)SelectObject(hDC, hBmp); 
BitBlt(hDC, 0, 0, Width, Height, hWndDC, 0, 0, SRCCOPY); 

Répondre

0

J'ai lu une fois que les coords RECT coupé pixel bas, mais jamais entendu parler du pixel haut ... il un appel api peut être quelque part pour obtenir le taille de la décoration de la fenêtre ou quoi d'autre.

GetDCEx pourrait aussi aider.

Questions connexes