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.

enter image description here

28
demandé sur paul 2015-05-07 08:40:17

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;
}
10
répondu Barmak Shemirani 2017-12-27 17:41:36

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).

6
répondu FastAl 2017-05-23 12:08:03