1.需要Magnification.h,Magnification.lib 和Magnification.dll文件。
引入头文件和库文件:
#include<Magnification.h>
#pragma comment(lib, "Magnification.lib")
2.通过以下步骤简单地完成屏幕捕获过程
1.使用MagInitialize()函数初始化放大镜库。
if (!MagInitialize())
{
return FALSE;
}
2.创建具有WS_EX_LAYERED属性的主窗口,并将其设置为全屏且不可见。因为我们将使用它来存储捕获的图像,但是不想将其显示给用户,所以我们不显示它。
//获得屏幕分辨率
RECT rect;
HWND hDesktop = ::GetDesktopWindow();
::GetWindowRect(hDesktop, &rect);
//设置窗口为全屏并隐藏
SetWindowPos(hostHwnd, 0, 0, rect.right, rect.bottom, SWP_HIDEWINDOW);
//或MoveWindow(0, 0, rect.right, rect.bottom,TRUE);ShowWindow(hostHwnd,SW_HIDE);
//设置窗口的WS_EX_LAYERED属性
SetWindowLong(hostHwnd, GWL_EXSTYLE,
GetWindowLong(hostHwnd, GWL_EXSTYLE) | WS_EX_LAYERED);
//设置窗口为透明
SetLayeredWindowAttributes(hostHwnd, 0, 255, LWA_ALPHA);
3.创建WS_EX_LAYERED属性为父窗口的子窗口。该窗口创建时,窗口类名必须为” MagnifierWindow”其预定义的参数为WC_MAGNIFIER。如果要捕获鼠标光标,请创建创口时加入MS_SHOWMAGNIFIEDCURSOR属性。
hwndMag = CreateWindow(WC_MAGNIFIER, WC_MAGNIFIER,
WS_CHILD /*| MS_SHOWMAGNIFIEDCURSOR */| WS_VISIBLE,
0, 0, m_ScreenX, m_ScreenY,
hostHwnd, NULL, hInstance, NULL);
4.设置数据回调方法,用以获取返回的图像数据。该回调将在MagSetWindowSource时自动调用指定方法。
if (!MagSetImageScalingCallback(hwndMag, (MagImageScalingCallback)MagImageScaling))
{ return FALSE; }
5.调用该MagSetWindowFilterList()函数以排除捕获的指定窗口。这样采集到的桌面数据中将没有排除的窗口图像。
//设置要排除的窗口句柄
HWND hwnd[] = {hwnd1,hwnd2,hwnd3}
if (!MagSetWindowFilterList(hwndMag, MW_FILTERMODE_EXCLUDE, n, hwnd))
{
return;
}
6.每当MagSetWindowSource()调用该函数时,整个桌面都会捕获到放大窗口中。由于使用了放大镜窗口,所以图像数据无法用BitBlt方法来获得,只能通过回调方法来取得数据。该方法需要和创建窗口在同一个线程中使用。
//设置屏幕大小获取图像
RECT sourceRect;
sourceRect.top = 0;
sourceRect.left = 0;
sourceRect.right = m_ScreenX;
sourceRect.bottom = m_ScreenY;
if (!MagSetWindowSource(hwndMag, sourceRect))
{
return;
}
7.在自定义方法MagImageScaling中获得回调的图像数据。
BOOL MagImageScaling(HWND hwnd, void *srcData, MAGIMAGEHEADER srcHeader, void *destdata, MAGIMAGEHEADER destheader, RECT unclipped, RECT clipped, HRGN dirty)
图像通道位数为:int nCannel = srcHeader.cbSize / srcHeader.width / srcHeader.height
其中srcData为图像数据指针,数据大小为srcHeader.cbSize
srcHeader.format为图像格式,一般采集桌面是GUID_WICPixelFormat32bppRGBA格式
7251






