我想捕获一个Desktop框架并将其存储在HBITMAP结构中。 然后,在从我的应用程序主窗口的设备上下文中创建一个正确的内存设备上下文后,我会选择HBITMAP并使用StretchBlt来显示位图。
但是这不能按预期工作,因为它只显示一个黑框。 hdc和mem_hdc分别是之前初始化的主窗口的设备上下文和内存设备上下文。
以下是代码:
...
hDC desk_hdc, desk_mem_hdc;
BITMAP bitmap;
HBITMAP hbitmap;
desk_hdc = GetDC(NULL);
hbitmap = CreateCompatibleBitmap(desk_hdc, GetDeviceCaps(desk_hdc, HORZRES), GetDeviceCaps(desk_hdc, VERTRES));
GetObject(hbitmap, sizeof(BITMAP), &bitmap);
SelectObject(mem_hdc, hbitmap);
StretchBlt(hdc, 0, 0, 1024, 768, mem_hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY|CAPTUREBLT|NOMIRRORBITMAP);
...
答案 0 :(得分:2)
StretchBlt
操作的源dc是mem_hdc
,它具有兼容的未初始化位图。这就是为什么你会得到一个黑框。
如果要捕获桌面内容,则必须先将其复制到mem_hdc
中的位图。就在SelectObject
之后:
BitBlt( mem_hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, desk_hdc, 0, 0, SRCCOPY );