我正在使用GDI捕获屏幕,我注意到屏幕截图中不包含“工具提示”。这是我的基本代码:
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...
可以修复,还是应该使用其他方法来捕获屏幕(GDI除外)?
修改
这是我拍摄的不会显示工具提示的截图。
答案 0 :(得分:10)
更新:按照Alex K.,Adrian McCarthy等人的建议添加CAPTUREBLT
我无法重现同样的问题。如果你成功拍摄桌面屏幕截图,那么一切都应该在那里!请尝试使用此代码。请注意,3秒等待应该有时间手动激活工具提示。
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;
}
答案 1 :(得分:6)
几年前我用Windows XP系统遇到了确切的问题。我的问题答案中的代码解决了这个问题:
Capture screenshot Including Semitransparent windows in .NET
对于你,你应该能够将你的stretchblt行更改为bitblt并添加captureblt:
<meta name="viewport" content="width=320">
像透明窗口一样,工具提示会被bitblt的规范所跳过。另外,您还没有调整大小,所以请使用bitblt。如果这不起作用,那么正如其他评论者提示的那样,你正在做的事情可能还有其他问题,所以你可以将我的问题的答案从C#转换为C,这对我在XP上有用。 (当然,我不再需要XP来测试,但这绝对是个问题)。