使用Magnification实现移除指定窗口的屏幕截图

1.需要Magnification.hMagnification.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格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值