Screen shot en C avec curseur
jaky1212
Messages postés
126
Date d'inscription
Statut
Membre
Dernière intervention
-
jaky1212 Messages postés 126 Date d'inscription Statut Membre Dernière intervention -
jaky1212 Messages postés 126 Date d'inscription Statut Membre Dernière intervention -
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;
}
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:
- Screen shot en C avec curseur
- Screen whatsapp - Accueil - Messagerie instantanée
- Blue screen windows 10 - Guide
- Apowersoft screen recorder - Télécharger - Capture d'écran
- Double screen pc - Guide
- Screen lock - Télécharger - Sécurité
7 réponses
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
hum cela ne fonctionne pas, je n'utilise pas strechblt mais bitblt cela peut avoir une influence ? vraiment étrange ce curseur :s