Screen shot en C avec curseur

Fermé
jaky1212 Messages postés 126 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 4 mars 2013 - 11 févr. 2010 à 16:59
jaky1212 Messages postés 126 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 4 mars 2013 - 13 févr. 2010 à 12:06
Coucou,
J'essaye de faire un screenshot dans un application, et dans celle-ci ce qui m'intéresse c'est le curseur qui change souvent en fonction de la position et d'autre paramètres.. bref dans mes screenshot j'ai tout sauf le curseur :) .
Comment faire pour faire apparaitre le curseur dessus ?

Je poste le code vite fait :
int hwnd_to_bmp_attente(HWND hwnd, char *pszflname,int X,int Y)
{
HDC memdc;
HANDLE hfl;
DWORD dwBytes, dwNumColors;
void *pBits;
HBITMAP hbmp;
BITMAPFILEHEADER fileheader;
BITMAPINFOHEADER infoheader;
RGBQUAD colors[256];
BITMAPINFO bmpinfo;
HGDIOBJ hret;
HDC hdc = GetDC(hwnd);

GetWindowRect(hwnd, &rct);
rct.bottom=rct.top+300;
rct.right=rct.left+300;


rct.top = GetDeviceCaps(hdc, BITSPIXEL);
if(rct.top <= 8)
dwNumColors = 256;
else
dwNumColors = 0;
if(!(memdc = CreateCompatibleDC(hdc)))
goto relHwndDc;

bmpinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpinfo.bmiHeader.biWidth = rct.right;
bmpinfo.bmiHeader.biHeight = rct.bottom;
bmpinfo.bmiHeader.biPlanes = 1;
bmpinfo.bmiHeader.biBitCount = (WORD) rct.top;
bmpinfo.bmiHeader.biCompression = BI_RGB;
bmpinfo.bmiHeader.biSizeImage = 0;
bmpinfo.bmiHeader.biXPelsPerMeter = 0;
bmpinfo.bmiHeader.biYPelsPerMeter = 0;
bmpinfo.bmiHeader.biClrUsed = dwNumColors;
bmpinfo.bmiHeader.biClrImportant = dwNumColors;
hbmp = CreateDIBSection(hdc, &bmpinfo, DIB_PAL_COLORS, &pBits, NULL, 0);

if(!hbmp) goto errato;
hret = SelectObject(memdc, hbmp);
if(!hret || (hret == HGDI_ERROR)) goto errato;

if(!BitBlt(memdc,0,0, rct.right, rct.bottom, hdc,0,0, SRCCOPY)) goto errato;
if(dwNumColors)
dwNumColors = GetDIBColorTable(memdc, 0, dwNumColors, colors);

fileheader.bfType = 0x4D42;
rct.left = dwNumColors * sizeof(RGBQUAD);
fileheader.bfSize = ((rct.right * rct.bottom * rct.top) >> 3) + rct.left + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
fileheader.bfReserved1 = fileheader.bfReserved2 = 0;
fileheader.bfOffBits = rct.left + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
infoheader.biSize = sizeof(BITMAPINFOHEADER);
infoheader.biWidth = rct.right;
infoheader.biHeight = rct.bottom;
infoheader.biPlanes = 1;
infoheader.biBitCount = (WORD) rct.top;
infoheader.biCompression = BI_RGB;
infoheader.biSizeImage = infoheader.biClrImportant = 0;
infoheader.biXPelsPerMeter = infoheader.biYPelsPerMeter = 0;
infoheader.biClrUsed = dwNumColors;

hfl = CreateFile(pszflname, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (hfl == INVALID_HANDLE_VALUE) {DeleteObject(hbmp); goto errato;}
WriteFile(hfl, &fileheader, sizeof(BITMAPFILEHEADER), &dwBytes, 0);
WriteFile(hfl, &infoheader, sizeof(BITMAPINFOHEADER), &dwBytes, 0);
if(!dwNumColors)
WriteFile(hfl, colors, rct.left, &dwBytes, 0);
WriteFile(hfl, pBits, (rct.right * rct.bottom * rct.top) >> 3, &dwBytes, 0);
CloseHandle(hfl);
DeleteObject(hbmp);
DeleteDC(memdc);
return 1;
errato:
DeleteDC(memdc);
relHwndDc:
ReleaseDC(hwnd, hdc); return 0;
}
A voir également:

7 réponses

jaky1212 Messages postés 126 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 4 mars 2013 8
11 févr. 2010 à 23:06
up
0
jaky1212 Messages postés 126 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 4 mars 2013 8
12 févr. 2010 à 12:35
re UP :)
0
bitrate Messages postés 439 Date d'inscription vendredi 25 avril 2008 Statut Membre Dernière intervention 22 mars 2011 98
12 févr. 2010 à 14:09
il y a deux solutions :

soit rajouter CAPTUREBLT | SRCCOPY dans la fonction bitblt/StretchBlt. ça permet de capturer aussi le curseur et les images en overlay (ça fait légèrement déconner l'affichage)

soit prendre les coord du pointeur et le dessiner directement sur le DC
0
jaky1212 Messages postés 126 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 4 mars 2013 8
12 févr. 2010 à 17:45
merci, je vais tester
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jaky1212 Messages postés 126 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 4 mars 2013 8
12 févr. 2010 à 18:05
hum cela ne fonctionne pas, je n'utilise pas strechblt mais bitblt cela peut avoir une influence ? vraiment étrange ce curseur :s
0
bitrate Messages postés 439 Date d'inscription vendredi 25 avril 2008 Statut Membre Dernière intervention 22 mars 2011 98
12 févr. 2010 à 20:45
normal le curseur n'est pas affiché en 'bitmap' mais en 'sprite' par la carte graphique.
0
jaky1212 Messages postés 126 Date d'inscription mardi 25 août 2009 Statut Membre Dernière intervention 4 mars 2013 8
13 févr. 2010 à 12:06
je viens d'essayer stretchblt au lieu de bitblt avec les bon flags cela ne fonctionne pas j'ai toujours l'image mais pas le curseur :( je vais essayer de chercher de mon coté . c'est quand meme tres étrange
0