Comment capturer l'écran avec les "conseils D'outils"?
j'utilise GDI pour capturer l'écran, et j'ai remarqué que les" conseils D'outils " ne sont pas inclus dans la capture d'écran. C'est mon code de base:
HDC hdcDesk = GetDC(0);
HDC hdcMem = CreateCompatibleDC(hdcDesk);
HBITMAP hbmMem = CreateCompatibleBitmap(hdcDesk, 1920, 1080);
SelectObject(hdcMem, hbmMem);
StretchBlt(hdcMem, 0, 0, 1920, 1080, hdcDesk, 0, 0, 1920, 1080, SRCCOPY);
// Now save the bitmap...
est-ce que cela peut être corrigé, ou devrais-je utiliser une autre approche pour capturer l'écran (autre que GDI)?
modifier:
C'est une capture d'écran que j'ai pris qui n'affiche pas la Pointe de l'Outil.
2 réponses
mise à jour: ajouté CAPTUREBLT
comme suggéré par Alex K., Adrian McCarthy et al.
je ne peux pas reproduire le même problème. Si vous réussissez à prendre screen shot de bureau alors tout devrait être là! Essayez plutôt ce code. Note l'attente de 3 secondes est censée donner le temps d'activer manuellement une pointe d'outil.
int main()
{
Sleep(3000);
TCHAR* filename = TEXT("c:\test\_bmp.bmp");
int width = GetSystemMetrics(SM_CXFULLSCREEN);
int height = GetSystemMetrics(SM_CYFULLSCREEN);
HDC hdc = GetDC(HWND_DESKTOP);
HBITMAP hbitmap = CreateCompatibleBitmap(hdc, width, height);
HDC memdc = CreateCompatibleDC(hdc);
HGDIOBJ oldbmp = SelectObject(memdc, hbitmap);
BitBlt(memdc, 0, 0, width, height, hdc, 0, 0, CAPTUREBLT | SRCCOPY);
WORD bpp = 24; //24-bit bitmap
DWORD size = ((width * bpp + 31) / 32) * 4 * height;
BITMAPFILEHEADER filehdr = { 'MB', 54 + size, 0, 0, 54 };
BITMAPINFOHEADER infohdr = { 40, width, height, 1, bpp };
std::vector<BYTE> bits(size);
GetDIBits(hdc, hbitmap, 0, height, &bits[0], (BITMAPINFO*)&infohdr, DIB_RGB_COLORS);
std::ofstream f(filename, std::ios::binary);
f.write((char*)&filehdr, sizeof(filehdr));
f.write((char*)&infohdr, sizeof(infohdr));
f.write((char*)bits.data(), size);
SelectObject(memdc, oldbmp);
DeleteObject(memdc);
DeleteObject(hbitmap);
ReleaseDC(HWND_DESKTOP, hdc);
ShellExecute(0, 0, filename, 0, 0, SW_SHOW);
return 0;
}
j'ai eu le même problème il y a quelques années avec un système windows XP. Le code dans la réponse à ma question a résolu le problème:
Capture d'écran incluant des fenêtres semi-transparentes dans .NET
pour vous, vous devriez être en mesure de changer votre ligne stretchblt en bitblt et ajouter captureblt:
HDC hdcDesk = GetDC(0);
HDC hdcMem = CreateCompatibleDC(hdcDesk);
HBITMAP hbmMem = CreateCompatibleBitmap(hdcDesk, 1920, 1080);
SelectObject(hdcMem, hbmMem);
BitBlt(hdcMem, 0, 0, 1920, 1080, hdcDesk, 0, 0, SRCCOPY | CAPTUREBLT);
// Now save the bitmap...
les infobulles, comme les fenêtres transparentes, sont sautées par spec de bitblt. De Plus, vous n'êtes pas redimensionnement, utilisez bitblt. Si cela ne fonctionne pas, il pourrait y avoir quelque chose d'autre de mal avec ce que vous faites comme les autres indices commentateurs, de sorte que vous pouvez convertir la réponse à ma question de C# à C, qui a fonctionné pour moi sur XP. (bien sûr, je n'ai plus XP à tester mais c'était définitivement le problème).