1

我正在尝试从屏幕的 0x0(左上角)位置获取 500x500 的屏幕截图并将其放在窗口中。

这是我的代码(hwnd是我的窗口句柄):

HDC appDc = GetDC(hwnd);
HDC dc = GetDC(NULL);
HBITMAP bitmap = CreateCompatibleBitmap(dc, 500, 500);
HDC memoryDc = CreateCompatibleDC(dc);
SelectObject(memoryDc, bitmap);
BitBlt(appDc, 0, 0, 500, 500, dc, 0, 0, SRCCOPY);
ShowWindow(hwnd, SW_SHOW);
SetWindowText(hwnd, _T("Window"));   

我在这里想念什么?我在窗口内变黑而不是屏幕截图。

编辑

在我更改memoryDcdc 之前它之后它可以工作BitBlt(appDc, 0, 0, 500, 500, memoryDc, 0, 0, SRCCOPY); 但现在问题是 SelectObject 不起作用。我的意思是它没有将图像放在 HBITMAP 中。但是 BitBlt 正在从复制dcappDc

4

2 回答 2

1

首先,似乎与设备上下文存在混淆。您从 memoryDc 到 appDc,但 memoryDc 不包含任何内容 - 它已被创建为与 dc 兼容,但这并不意味着它共享内容。此外,您不会在示例中发布 DC。

其次,您对 ShowWindow() 的调用似乎暗示该窗口以前不可见。如果是这种情况,则之前“绘制”的任何内容实际上都没有被绘制,并且不会在窗口中可见。在位图中捕获屏幕内容并在 WM_PAINT 期间显示。

于 2011-03-31T11:34:58.297 回答
0

由于您在ShowWindow代码块的末尾调用应用程序的窗口,因此我假设该窗口在此之前是可见的。

如果是这样,那么这就是你的问题,因为当一个不可见的窗口再次可见时,它的客户区总是被重新绘制。这会导致使用该窗口的默认画笔(在您的情况下显然是黑色画笔)擦除其背景,并且您BitBlt在其设备上下文(DC)中绘制的任何内容(使用该函数)都将丢失。

一个更好的方法是将屏幕截图绘制到一个临时位图中,而不是。WM_PAINT然后,只需保留此位图的副本,并在收到消息时将其绘制到窗口上。

于 2011-03-31T11:26:53.073 回答