Подтвердить что ты не робот

Как захватить экран с помощью "подсказок"?

Я использую 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)?


Edit:

Это скриншот, который я взял, который не отображает подсказку.

enter image description here

4b9b3361

Ответ 1

Обновление: добавлено 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;
}

Ответ 2

У меня была точная проблема несколько лет назад с системой 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. Кроме того, вы не изменяете размер, поэтому используйте bitblt. Если это не сработает, может быть что-то еще не так, что вы делаете, как подсказывают другие комментаторы, поэтому вы можете преобразовать ответ на мой вопрос с С# на C, который работал у меня на XP. (конечно, у меня больше нет XP для тестирования, но это определенно проблема).