c++ c winapi gdi

c++ - ¿Cómo capturar la pantalla con los "Consejos sobre herramientas"?



winapi gdi (2)

Actualización: agregó CAPTUREBLT como lo sugirieron Alex K., Adrian McCarthy y otros.

No puedo reproducir el mismo problema. ¡Si logras tomar una captura de pantalla de escritorio, entonces todo debería estar allí! Pruebe este código en su lugar. Tenga en cuenta que se supone que la espera de 3 segundos da tiempo para activar manualmente una información sobre herramientas.

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; }

Estoy usando GDI para capturar la pantalla, y he notado que los "Consejos de herramientas" no están incluidos en la captura de pantalla. Este es mi código básico:

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

¿Se puede arreglar esto, o debería usar otro enfoque para capturar la pantalla (que no sea GDI)?

Editar:

Esta es una captura de pantalla que tomé y que no muestra la información sobre herramientas.


Tuve el problema exacto hace unos años con un sistema Windows XP. El código en la respuesta a mi pregunta resolvió el problema:

Captura de pantalla Incluyendo ventanas semitransparentes en .NET

Para ti, deberías poder cambiar tu línea stretchblt a bitblt y agregar 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...

La información sobre herramientas, como las ventanas transparentes, se omiten por especificación de bitblt. Además, no estás redimensionando, entonces usa bitblt. Si eso no funciona, puede haber algo más que esté mal con lo que está haciendo, como lo insinúan los otros comentaristas, por lo que puede convertir la respuesta a mi pregunta de C # a C, que funcionó para mí en XP. (por supuesto, no tengo XP más para probar, pero definitivamente ese era el problema).