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

pau*_*aul 28 c c++ winapi gdi

我正在使用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...
Run Code Online (Sandbox Code Playgroud)

可以修复,还是应该使用其他方法捕获屏幕(GDI除外)?


编辑:

这是我拍摄的不显示工具提示的屏幕截图.

在此输入图像描述

Bar*_*ani 10

更新:CAPTUREBLT按照Alex K.,Adrian McCarthy等人的建议添加.

我不能重现同样的问题.如果你成功拍摄桌面屏幕截图,那么一切都应该在那里!请尝试使用此代码.请注意,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;
}
Run Code Online (Sandbox Code Playgroud)

  • 试试`SRCCOPY | CAPTUREBLT`每Alex K.的评论.这一直对我有用 (3认同)
  • 不幸的是,它没有用.我已经编辑了我的问题. (2认同)

Fas*_*tAl 6

几年前我用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...
Run Code Online (Sandbox Code Playgroud)

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