为了写一个含鼠标的录屏软件,我研究了一下关于鼠标的相关资料,最终写出了这么一个自制函数实现获取含鼠标图标的屏幕图片。
以下是函数内容:
#include <Windows.h>
#include <graphics.h>
void SaveImage() {
//获取屏幕宽高
int xScreen = GetSystemMetrics(SM_CXSCREEN);
int yScreen = GetSystemMetrics(SM_CYSCREEN);
//定义成果图的宽高
IMAGE img{ xScreen,yScreen };
//获取桌面HDC和成果图的HDC
HDC srcDC = GetDC(NULL);
HDC dstDC = GetImageHDC(&img);
//开始获取鼠标相关信息
CURSORINFO cursorInfo;
cursorInfo.cbSize = sizeof(CURSORINFO);
GetCursorInfo(&cursorInfo);//获取光标信息
POINT cursorPoint = cursorInfo.ptScreenPos;//光标当前所在坐标Pos
ICONINFO iconinfo;
GetIconInfo(cursorInfo.hCursor, &iconinfo);//获取光标对应的位图信息
BITMAP cursorBitMap;
GetObject(iconinfo.hbmColor, sizeof(BITMAP), &cursorBitMap);//获取鼠标位图宽高
//定义鼠标的掩码图和背景图
IMAGE cursor1Img{ cursorBitMap.bmWidth, cursorBitMap.bmHeight };
IMAGE cursor2Img{ cursorBitMap.bmWidth, cursorBitMap.bmHeight };
//获取掩码图和背景图的HDC
HDC cur1DC = GetImageHDC(&cursor1Img);
HDC cur2DC = GetImageHDC(&cursor2Img);
//绘入
SelectObject(cur1DC, iconinfo.hbmMask);
SelectObject(cur2DC, iconinfo.hbmColor);
BitBlt(dstDC, 0, 0, xScreen, yScreen, srcDC, 0, 0, SRCCOPY);
BitBlt(dstDC, cursorPoint.x, cursorPoint.y, cursorBitMap.bmWidth, cursorBitMap.bmHeight, cur1DC, 0, 0, SRCINVERT);
BitBlt(dstDC, cursorPoint.x, cursorPoint.y, cursorBitMap.bmWidth, cursorBitMap.bmHeight, cur2DC, 0, 0, SRCPAINT);
saveimage(TEXT("bg.bmp"), &img);
return;
}
int main()
{
SaveImage();
return 0;
}
结果: