实时捕捉屏幕
主要分为三个部分
- 获取屏幕
// 两个函数都可以进行位图复制,不过StretchBlt可以按照位图进行拉伸或者压缩
BitBlt(HDC hdc,int x,int y,int cx,int cy,HDC hdcSrc,int x1,int y1,DWORD rop);
或者
StretchBlt(HDC hdcDest,int xDest,int yDest,int wDest,int hDest,HDC hdcSrc,int xSrc,int ySrc,int wSrc,int hSrc,DWORD rop);
- 输出到客户端上
- 实时刷新
代码
// 输出到屏幕
case WM_PAINT:
{PAINTSTRUCT ps;HDC hdc = BeginPaint(hWnd, &ps);
// 获得客户端的RectRECT rectClient;GetClientRect(hWnd, &rectClient);
// 获得屏幕窗口句柄HWND hwnd = GetDesktopWindow();HDC hdcScreen = GetDC(hwnd);
// 获得屏幕的RectRECT rectScreen;GetWindowRect(hwnd, &rectScreen);
// 输出StretchBlt(hdc, 0, 0, rectClient.right, rectClient.bottom, hdcScreen, 0, 0, rectScreen.right, rectScreen.bottom, SRCCOPY);
//这个也可以
//BitBlt(hdc, 0, 0, rectClient.right, rectClient.bottom, hdcScreen,0, 0, SRCCOPY);EndPaint(hWnd, &ps);
}
// 实时刷新
case WM_CREATE:SetTimer(hWnd, 1, 100, NULL); // 设置定时器的刷新时间return 0;
case WM_TIMER:
{InvalidateRect(hWnd, NULL, TRUE); //刷新窗口用
}
不过真正运行起来后,我们会发现这个是一闪闪亮晶晶的捕捉屏幕。
解决方法很简单
BOOL InvalidateRect(
HWND hWnd, // handle of window with changed update region
CONST RECT *lpRect, // address of rectangle coordinates
BOOL bErase // erase-background flag
);
bErase:指出无效矩形被标记为有效后,是否重画该区域,重画时用预先定义好的画刷。当指定TRUE时需要重画。
我们将最后一项改为FALSE即可
InvalidateRect(hWnd, NULL, FALSE); //刷新窗口用
不要看太久,会眼晕


















