问题描述
我使用GDI捕捉屏幕,我已经注意到,工具提示中不包括的屏幕截图。这是我的基本code:
I am using GDI to capture the screen, and I have noticed that the "Tool Tips" are not included in the screenshot. This is my basic code:
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等)?
Can this be fixed, or should I use another approach to capture the screen (other than GDI)?
编辑:
这是我花了一个不显示工具提示的截图。
This is a screenshot that I took that does not display the Tool Tip.
推荐答案
更新:加入 CAPTUREBLT
作为由Alex K.,阿德里安·麦卡锡等人建议
Update: added CAPTUREBLT
as suggested by Alex K., Adrian McCarthy et al.
我无法重现同样的问题。如果您在服用的桌面截图成功,然后一切都应该有!试试这个code来代替。注5秒的等待应该给时间手动激活工具提示。
I can't reproduce the same problem. If you succeed in taking screen shot of desktop then everything should be there! Try this code instead. Note the 5 second wait is supposed to give time to manually activate a tool tip.
#include "windows.h"
void capture(HWND hwnd, const wchar_t* filename)
{
RECT rc;
GetWindowRect(hwnd, &rc);
int width = rc.right - rc.left;
int height = rc.bottom - rc.top;
if (width < 1 || height < 1)
return;
HDC hdc = GetDC(HWND_DESKTOP);
HDC memdc = CreateCompatibleDC(hdc);
HBITMAP bmp = CreateCompatibleBitmap(hdc, width, height);
HGDIOBJ oldbitmap = SelectObject(memdc, bmp);
BitBlt(memdc, 0, 0, width, height, hdc, rc.left, rc.top, CAPTUREBLT | SRCCOPY);
SelectObject(memdc, oldbitmap);
WORD bitCount = 32;
DWORD size = ((width * bitCount + 31) / 32) * 4 * height;
char *bits = new char[size];
DWORD szFileHdr = sizeof(BITMAPFILEHEADER);
DWORD szInfoHdr = sizeof(BITMAPINFOHEADER);
BITMAPFILEHEADER bmpFileHeader =
{ 'MB', szFileHdr + szInfoHdr + size, 0, 0, szFileHdr + szInfoHdr };
BITMAPINFOHEADER bmpInfoHeader =
{ szInfoHdr, width, height, 1, bitCount, BI_RGB, 0, 0, 0, 0, 0 };
GetDIBits(hdc, bmp, 0, height, bits, (BITMAPINFO*)&bmpInfoHeader, DIB_RGB_COLORS);
HANDLE hfile = CreateFileW(filename,
GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hfile != INVALID_HANDLE_VALUE)
{
DWORD temp;
WriteFile(hfile, &bmpFileHeader, szFileHdr, &temp, NULL);
WriteFile(hfile, &bmpInfoHeader, szInfoHdr, &temp, NULL);
WriteFile(hfile, bits, size, &temp, NULL);
CloseHandle(hfile);
}
DeleteObject(bmp);
DeleteObject(memdc);
ReleaseDC(HWND_DESKTOP, hdc);
delete[]bits;
ShellExecuteW(0, 0, filename, 0, 0, SW_SHOW);
}
int WINAPI wWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
Sleep(5000);
capture(GetDesktopWindow(), "c:\\stuff\\test.bmp");
return 0;
}
这篇关于如何捕捉针对&quot屏幕,工具提示&QUOT;?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!