如何使用“工具提示”捕获屏幕?

我正在使用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除外)?


编辑:

这是我拍摄的截图,不显示工具提示。

在此处输入图像描述

更新:按照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 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; } 

几年前我用Windows XP系统遇到了确切的问题。 我的问题的答案中的代码解决了这个问题:

捕获截图包括.NET中的半透明窗口

对于您,您应该能够将stretchblt行更改为bitblt并添加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... 

像透明窗口一样的工具提示被bitblt规范跳过。 另外,你没有resize,所以使用bitblt。 如果这不起作用,那么正如其他评论者提示的那样,你正在做的事情可能还有其他问题,所以你可以将我的问题的答案从C#转换为C,这对我在XP上有用。 (当然我没有XP测试,但这绝对是问题)。